From 9946b502ebc0c1ae42a4762d8995603e8dacedea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 08:31:55 +0100 Subject: [PATCH 01/63] chore(deps): bump artemis.version from 2.31.1 to 2.31.2 in /dhis-2 (#15530) Bumps `artemis.version` from 2.31.1 to 2.31.2. Updates `org.apache.activemq:artemis-jms-client` from 2.31.1 to 2.31.2 - [Commits](https://github.com/apache/activemq-artemis/compare/2.31.1...2.31.2) Updates `org.apache.activemq:artemis-server` from 2.31.1 to 2.31.2 - [Commits](https://github.com/apache/activemq-artemis/compare/2.31.1...2.31.2) --- updated-dependencies: - dependency-name: org.apache.activemq:artemis-jms-client dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.apache.activemq:artemis-server dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index f1a13cabbd5e..901c2391951e 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -164,7 +164,7 @@ 1.19.0 - 2.31.1 + 2.31.2 4.1.100.Final 4.8.163 From 47bc4b2ade1baffbb6693ae149bca6126c2f352e Mon Sep 17 00:00:00 2001 From: tonsV2 Date: Mon, 30 Oct 2023 15:35:05 +0800 Subject: [PATCH 02/63] ci:deploy nightly on im-play (#15521) * ci: wait for the actual instance we just deployed Signed-off-by: TonsV2 * ci: deploy nightly on IM Signed-off-by: TonsV2 --------- Signed-off-by: TonsV2 --- jenkinsfiles/canary | 55 +++++++++++++++++++++++++++++++++++++++++ jenkinsfiles/dev | 4 +-- jenkinsfiles/stable | 60 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 2 deletions(-) diff --git a/jenkinsfiles/canary b/jenkinsfiles/canary index e10f37437eb8..7b0990371f15 100644 --- a/jenkinsfiles/canary +++ b/jenkinsfiles/canary @@ -41,6 +41,61 @@ pipeline { } } } + + stage('Update IM Play instance') { + environment { + HTTP = "http --check-status" + IM_REPO_URL = "https://github.com/dhis2-sre/im-manager" + IM_HOST = "https://api.im.dhis2.org" + INSTANCE_URL = "https://play.im.dhis2.org/nightly" + IMAGE_REPOSITORY = "core-canary" + IMAGE_PULL_POLICY = "Always" + FLYWAY_MIGRATE_OUT_OF_ORDER = "true" + FLYWAY_REPAIR_BEFORE_MIGRATION = "true" + INSTANCE_TTL = "315360000" + STARTUP_PROBE_FAILURE_THRESHOLD = "50" + LIVENESS_PROBE_TIMEOUT_SECONDS = "3" + READINESS_PROBE_TIMEOUT_SECONDS = "3" + } + + steps { + script { + withCredentials([usernamePassword(credentialsId: 'dhis2-im-bot', passwordVariable: 'PASSWORD', usernameVariable: 'USER_EMAIL')]) { + dir('im-manager') { + gitHelper.sparseCheckout(IM_REPO_URL, "${gitHelper.getLatestTag(IM_REPO_URL)}", '/scripts') + + echo 'Creating DHIS2 instance on IM...' + def branch = "" + if (env.GIT_BRANCH == 'master') { + env.IMAGE_TAG = "latest" + env.DATABASE_ID = "test-dbs-sierra-leone-dev-sql-gz" + } else { + env.IMAGE_TAG = env.GIT_BRANCH + branch = "-${env.GIT_BRANCH.replaceAll(".", "-")}" + + dir('scripts/databases') { + env.DATABASE_ID = sh( + returnStdout: true, + script: "./list.sh | jq -r '.[] | select(.name == \"test-dbs\") | .databases[] | select(.name == \"sierra-leone/${env.GIT_BRANCH}.sql.gz\") | .slug'" + ).trim() + } + } + + sh '[ -n "$DATABASE_ID" ]' + echo "Database: ${env.DATABASE_ID}" + + dir('scripts/instances') { + sh "(./findByName.sh play nightly${branch} && ./restart.sh play nightly${branch}) || ./deploy-dhis2.sh play nightly${branch}" + timeout(5) { + waitFor.statusOk("${env.INSTANCE_URL}${branch}") + } + } + } + } + } + } + } + stage ('Build') { steps { echo 'Building DHIS2 ...' diff --git a/jenkinsfiles/dev b/jenkinsfiles/dev index 1108e9bd5880..fe50c0174382 100644 --- a/jenkinsfiles/dev +++ b/jenkinsfiles/dev @@ -188,7 +188,7 @@ pipeline { } } - stage('Update IM Play dev instance') { + stage('Update IM Play instance') { environment { HTTP = "http --check-status" IM_REPO_URL = "https://github.com/dhis2-sre/im-manager" @@ -233,7 +233,7 @@ pipeline { dir('scripts/instances') { sh "(./findByName.sh play dev${branch} && ./restart.sh play dev${branch}) || ./deploy-dhis2.sh play dev${branch}" timeout(5) { - waitFor.statusOk("${env.INSTANCE_URL}") + waitFor.statusOk("${env.INSTANCE_URL}${branch}") } } } diff --git a/jenkinsfiles/stable b/jenkinsfiles/stable index 223fe1a4e62c..2d01430353dd 100644 --- a/jenkinsfiles/stable +++ b/jenkinsfiles/stable @@ -123,6 +123,66 @@ pipeline { } } + stage('Update IM Play instance') { + environment { + HTTP = "http --check-status" + IM_REPO_URL = "https://github.com/dhis2-sre/im-manager" + IM_HOST = "https://api.im.dhis2.org" + INSTANCE_URL = "https://play.im.dhis2.org/stable" + IMAGE_REPOSITORY = "core" + IMAGE_PULL_POLICY = "Always" + FLYWAY_MIGRATE_OUT_OF_ORDER = "true" + FLYWAY_REPAIR_BEFORE_MIGRATION = "true" + INSTANCE_TTL = "315360000" + STARTUP_PROBE_FAILURE_THRESHOLD = "50" + LIVENESS_PROBE_TIMEOUT_SECONDS = "3" + READINESS_PROBE_TIMEOUT_SECONDS = "3" + } + + steps { + when { + expression { !env.DOCKER_IMAGE_TAG.endsWith("rc") } + } + echo 'Creating DHIS2 instance on IM...' + script { + withCredentials([usernamePassword(credentialsId: 'dhis2-im-bot', passwordVariable: 'PASSWORD', usernameVariable: 'USER_EMAIL')]) { + dir('im-manager') { + gitHelper.sparseCheckout(IM_REPO_URL, "${gitHelper.getLatestTag(IM_REPO_URL)}", '/scripts') + + def version = env.GIT_BRANCH + if (version.startsWith("patch/")) { + version = version.split("/")[1] + } + // If version contains more than 2 dots... It's a hotfix + def isHotfix = version.length() - version.replace(".", "").length() > 2 + if (isHotfix) { + def endIndex = version.lastIndexOf(".") + version = version.substring(0, endIndex) + } + + dir('scripts/databases') { + env.DATABASE_ID = sh( + returnStdout: true, + script: "./list.sh | jq -r '.[] | select(.name == \"test-dbs\") | .databases[] | select(.name == \"sierra-leone/${version}.sql.gz\") | .slug'" + ).trim() + } + + sh '[ -n "$DATABASE_ID" ]' + echo "Database: ${env.DATABASE_ID}" + + def name = "-${version.replace(".", "-")}" + dir('scripts/instances') { + sh "(./findByName.sh play stable${name} && ./restart.sh play stable${name}) || ./deploy-dhis2.sh play stable${name}" + timeout(5) { + waitFor.statusOk("${env.INSTANCE_URL}${name}") + } + } + } + } + } + } + } + stage ('Sync WAR') { steps { echo 'Syncing WAR ...' From 77f585b2925fe9b7d1b45b653e0a3b41ec210748 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 07:55:07 +0000 Subject: [PATCH 03/63] chore(deps): bump org.apache.commons:commons-text in /dhis-2 (#15529) Bumps org.apache.commons:commons-text from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 901c2391951e..dfb7df091f39 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -189,7 +189,7 @@ 4.4 1.9.4 3.13.0 - 1.10.0 + 1.11.0 1.5 3.6.1 1.7 From 0367bab8ec2e803c6e862e24b5c7ae505c6656e6 Mon Sep 17 00:00:00 2001 From: marc Date: Mon, 30 Oct 2023 10:30:35 +0100 Subject: [PATCH 04/63] fix: Make capture mode return enrollments in capture scope [TECH-1635] (#15518) * fix: Make capture mode return enrollments in capture scope [TECH-1635] * fix: Inlcude fix in enrollment pager method [TECH-1635] * fix: Show capture scope enrollments when capture mode used [TECH-1635] --- .../program/DefaultEnrollmentService.java | 13 ++++++- .../enrollment/DefaultEnrollmentService.java | 8 ++++ .../dhis/program/EnrollmentServiceTest.java | 33 +++++++++++++++++ .../enrollment/EnrollmentServiceTest.java | 37 ++++++++++++++++++- 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java index 024f8891f2c7..9aca2eb7d69c 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java @@ -29,6 +29,7 @@ import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CHILDREN; import java.util.Date; @@ -174,6 +175,9 @@ public List getEnrollments(EnrollmentQueryParams params) { if (user != null && params.isOrganisationUnitMode(OrganisationUnitSelectionMode.ACCESSIBLE)) { params.setOrganisationUnits(user.getTeiSearchOrganisationUnitsWithFallback()); params.setOrganisationUnitMode(OrganisationUnitSelectionMode.DESCENDANTS); + } else if (user != null && params.isOrganisationUnitMode(CAPTURE)) { + params.setOrganisationUnits(user.getOrganisationUnits()); + params.setOrganisationUnitMode(OrganisationUnitSelectionMode.DESCENDANTS); } else if (params.isOrganisationUnitMode(CHILDREN)) { Set organisationUnits = new HashSet<>(params.getOrganisationUnits()); @@ -252,7 +256,9 @@ public void validate(EnrollmentQueryParams params) throws IllegalQueryException User user = params.getUser(); if (!params.hasOrganisationUnits() - && !(params.isOrganisationUnitMode(ALL) || params.isOrganisationUnitMode(ACCESSIBLE))) { + && !(params.isOrganisationUnitMode(ALL) + || params.isOrganisationUnitMode(ACCESSIBLE) + || params.isOrganisationUnitMode(CAPTURE))) { violation = "At least one organisation unit must be specified"; } @@ -262,6 +268,11 @@ public void validate(EnrollmentQueryParams params) throws IllegalQueryException "Current user must be associated with at least one organisation unit when selection mode is ACCESSIBLE"; } + if (params.isOrganisationUnitMode(CAPTURE) && (user == null || !user.hasOrganisationUnit())) { + violation = + "Current user must be associated with at least one organisation unit when selection mode is CAPTURE"; + } + if (params.hasProgram() && params.hasTrackedEntityType()) { violation = "Program and tracked entity cannot be specified simultaneously"; } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java index 6c61016c279f..6ecdf046ec00 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java @@ -28,7 +28,9 @@ package org.hisp.dhis.tracker.export.enrollment; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CHILDREN; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.DESCENDANTS; import java.util.ArrayList; import java.util.HashSet; @@ -204,6 +206,9 @@ public List getEnrollments(EnrollmentOperationParams params) && queryParams.isOrganisationUnitMode(OrganisationUnitSelectionMode.ACCESSIBLE)) { queryParams.setOrganisationUnits(user.getTeiSearchOrganisationUnitsWithFallback()); queryParams.setOrganisationUnitMode(OrganisationUnitSelectionMode.DESCENDANTS); + } else if (user != null && queryParams.isOrganisationUnitMode(CAPTURE)) { + queryParams.setOrganisationUnits(user.getOrganisationUnits()); + queryParams.setOrganisationUnitMode(DESCENDANTS); } else if (queryParams.isOrganisationUnitMode(CHILDREN)) { Set organisationUnits = new HashSet<>(queryParams.getOrganisationUnits()); @@ -234,6 +239,9 @@ public Page getEnrollments(EnrollmentOperationParams params, PagePar && queryParams.isOrganisationUnitMode(OrganisationUnitSelectionMode.ACCESSIBLE)) { queryParams.setOrganisationUnits(user.getTeiSearchOrganisationUnitsWithFallback()); queryParams.setOrganisationUnitMode(OrganisationUnitSelectionMode.DESCENDANTS); + } else if (user != null && queryParams.isOrganisationUnitMode(CAPTURE)) { + queryParams.setOrganisationUnits(user.getOrganisationUnits()); + queryParams.setOrganisationUnitMode(DESCENDANTS); } else if (queryParams.isOrganisationUnitMode(CHILDREN)) { Set organisationUnits = new HashSet<>(queryParams.getOrganisationUnits()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EnrollmentServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EnrollmentServiceTest.java index f2d6922c00b9..aa8787bb9463 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EnrollmentServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EnrollmentServiceTest.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.program; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -46,6 +47,8 @@ import org.hisp.dhis.test.integration.TransactionalIntegrationTest; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityService; +import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserService; import org.joda.time.DateTime; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -67,6 +70,8 @@ class EnrollmentServiceTest extends TransactionalIntegrationTest { @Autowired private EventService eventService; + @Autowired protected UserService _userService; + @Autowired NoteService noteService; private Date incidentDate; @@ -95,12 +100,23 @@ class EnrollmentServiceTest extends TransactionalIntegrationTest { private TrackedEntity entityInstanceA; + private User user; + @Override public void setUpTest() { + userService = _userService; + organisationUnitA = createOrganisationUnit('A'); organisationUnitService.addOrganisationUnit(organisationUnitA); organisationUnitB = createOrganisationUnit('B'); organisationUnitService.addOrganisationUnit(organisationUnitB); + + user = + createAndAddUser( + false, "user", Set.of(organisationUnitA), Set.of(organisationUnitA), "F_EXPORT_DATA"); + user.setTeiSearchOrganisationUnits(Set.of(organisationUnitA, organisationUnitB)); + user.setOrganisationUnits(Set.of(organisationUnitA)); + programA = createProgram('A', new HashSet<>(), organisationUnitA); programService.addProgram(programA); ProgramStage stageA = createProgramStage('A', programA); @@ -146,6 +162,8 @@ public void setUpTest() { enrollmentD = new Enrollment(enrollmentDate, incidentDate, entityInstanceB, programA); enrollmentD.setUid("UID-D"); enrollmentD.setOrganisationUnit(organisationUnitB); + + injectSecurityContext(user); } @Test @@ -260,6 +278,21 @@ void testGetEnrollmentsByOuProgram() { assertTrue(enrollments.contains(enrollmentA)); } + @Test + void shouldGetEnrollmentsInCaptureScopeIfOrgUnitModeCapture() { + enrollmentService.addEnrollment(enrollmentA); + enrollmentService.addEnrollment(enrollmentC); + enrollmentService.addEnrollment(enrollmentD); + + List enrollments = + enrollmentService.getEnrollments( + new EnrollmentQueryParams().setUser(user).setOrganisationUnitMode(CAPTURE)); + + assertEquals(2, enrollments.size()); + assertTrue(enrollments.contains(enrollmentA)); + assertTrue(enrollments.contains(enrollmentC)); + } + @Test void testEnrollTrackedEntity() { Enrollment enrollment = diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java index 2a90de732c46..e8fbf65b1783 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.tracker.export.enrollment; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; import static org.hisp.dhis.tracker.TrackerTestUtils.oneHourAfter; import static org.hisp.dhis.tracker.TrackerTestUtils.oneHourBefore; import static org.hisp.dhis.tracker.TrackerTestUtils.uids; @@ -92,6 +93,8 @@ class EnrollmentServiceTest extends TransactionalIntegrationTest { private Enrollment enrollmentB; + private Enrollment enrollmentChildA; + private Event eventA; private TrackedEntity trackedEntityA; @@ -117,6 +120,8 @@ protected void setUpTest() throws Exception { manager.save(orgUnitB, false); OrganisationUnit orgUnitC = createOrganisationUnit('C'); manager.save(orgUnitC, false); + OrganisationUnit orgUnitChildA = createOrganisationUnit('D', orgUnitA); + manager.save(orgUnitChildA, false); User user = createAndAddUser(false, "user", Set.of(orgUnitA), Set.of(orgUnitA), "F_EXPORT_DATA"); @@ -139,6 +144,10 @@ protected void setUpTest() throws Exception { trackedEntityC.setTrackedEntityType(trackedEntityTypeA); manager.save(trackedEntityC, false); + TrackedEntity trackedEntityChildA = createTrackedEntity(orgUnitChildA); + trackedEntityChildA.setTrackedEntityType(trackedEntityTypeA); + manager.save(trackedEntityChildA, false); + programA = createProgram('A', new HashSet<>(), orgUnitA); programA.setProgramType(ProgramType.WITH_REGISTRATION); programA.setTrackedEntityType(trackedEntityTypeA); @@ -209,6 +218,10 @@ protected void setUpTest() throws Exception { programInstanceService.enrollTrackedEntity( trackedEntityB, programA, new Date(), new Date(), orgUnitB); + enrollmentChildA = + programInstanceService.enrollTrackedEntity( + trackedEntityChildA, programA, new Date(), new Date(), orgUnitChildA); + injectSecurityContext(user); } @@ -384,7 +397,9 @@ void shouldGetEnrollmentsWhenUserHasReadAccessToProgramAndSearchScopeAccessToOrg List enrollments = enrollmentService.getEnrollments(params); assertNotNull(enrollments); - assertContainsOnly(List.of(enrollmentA.getUid(), enrollmentB.getUid()), uids(enrollments)); + assertContainsOnly( + List.of(enrollmentA.getUid(), enrollmentB.getUid(), enrollmentChildA.getUid()), + uids(enrollments)); } @Test @@ -400,7 +415,25 @@ void shouldGetEnrollmentsWhenUserHasReadAccessToProgramAndNoOrgUnitNorOrgUnitMod List enrollments = enrollmentService.getEnrollments(params); assertNotNull(enrollments); - assertContainsOnly(List.of(enrollmentA.getUid(), enrollmentB.getUid()), uids(enrollments)); + assertContainsOnly( + List.of(enrollmentA.getUid(), enrollmentB.getUid(), enrollmentChildA.getUid()), + uids(enrollments)); + } + + @Test + void shouldGetEnrollmentsInCaptureScopeIfOrgUnitModeCapture() + throws ForbiddenException, BadRequestException, NotFoundException { + programA.getSharing().setPublicAccess(AccessStringHelper.FULL); + + manager.updateNoAcl(programA); + + EnrollmentOperationParams params = + EnrollmentOperationParams.builder().orgUnitMode(CAPTURE).build(); + + List enrollments = enrollmentService.getEnrollments(params); + + assertNotNull(enrollments); + assertContainsOnly(List.of(enrollmentA.getUid(), enrollmentChildA.getUid()), uids(enrollments)); } @Test From c3e8ff7d2f81afecabaecb8cda92343936eef071 Mon Sep 17 00:00:00 2001 From: Jim Grace Date: Mon, 30 Oct 2023 11:30:22 -0400 Subject: [PATCH 05/63] fix: event analytics multi-stage DEs [DHIS2-15873] (#15527) * fix: event analytics multi-stage DEs [DHIS2-15873] * fix more tests * formatting * fix: Failing tests [DHIS2-15873] * fix: Code formatting --------- Co-authored-by: maikelarabori --- .../ProgramSqlGeneratorFunctionsTest.java | 111 +- .../program/ProgramSqlGeneratorItemsTest.java | 10 +- .../AbstractStatementBuilder.java | 10 +- .../aggregate/AnalyticsQueryDv8AutoTest.java | 12 - .../query/EnrollmentsQuery2AutoTest.java | 1510 +---------------- ...ProgramIndicatorServiceD2FunctionTest.java | 33 +- .../program/ProgramIndicatorServiceTest.java | 23 +- 7 files changed, 133 insertions(+), 1576 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorFunctionsTest.java b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorFunctionsTest.java index 99315aa0cf9f..92f042f29142 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorFunctionsTest.java +++ b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorFunctionsTest.java @@ -189,7 +189,10 @@ void testCondition() { String sql = test("d2:condition('#{ProgrmStagA.DataElmentA} > 3',10 + 5,3 * 2)"); assertThat( - sql, is("case when (coalesce(\"DataElmentA\"::numeric,0) > 3) then 10 + 5 else 3 * 2 end")); + sql, + is( + "case when (coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0) " + + "> 3) then 10 + 5 else 3 * 2 end")); } @Test @@ -203,7 +206,10 @@ void testConditionWithBooleanAsBoolean() { String sql = test("d2:condition('#{ProgrmStagA.DataElmentE}',10 + 5,3 * 2)"); assertThat( sql, - is("case when (coalesce(\"DataElmentE\"::numeric!=0,false)) then 10 + 5 else 3 * 2 end")); + is( + "case when (coalesce(" + + "case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentE\" else null end::numeric!=0,false)) " + + "then 10 + 5 else 3 * 2 end")); } @Test @@ -216,7 +222,10 @@ void testConditionWithBooleanAsNumeric() { String sql = test("d2:condition('#{ProgrmStagA.DataElmentE} > 0',10 + 5,3 * 2)"); assertThat( - sql, is("case when (coalesce(\"DataElmentE\"::numeric,0) > 0) then 10 + 5 else 3 * 2 end")); + sql, + is( + "case when (coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentE\" else null end::numeric,0) " + + "> 0) then 10 + 5 else 3 * 2 end")); } @Test @@ -330,7 +339,8 @@ void testCountIfConditionWithBooleanAsNumeric() { "(select count(\"DataElmentA\") " + "from analytics_event_Program000A " + "where analytics_event_Program000A.pi = ax.pi " - + "and \"DataElmentA\" is not null and \"DataElmentA\" > coalesce(\"DataElmentE\"::numeric,0) " + + "and \"DataElmentA\" is not null and \"DataElmentA\" > " + + "coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentE\" else null end::numeric,0) " + "and ps = 'ProgrmStagA')")); } @@ -373,10 +383,13 @@ void testDaysBetween() { when(idObjectManager.get(DataElement.class, dataElementC.getUid())).thenReturn(dataElementC); when(idObjectManager.get(DataElement.class, dataElementD.getUid())).thenReturn(dataElementD); when(programStageService.getProgramStage(programStageA.getUid())).thenReturn(programStageA); - when(programStageService.getProgramStage(programStageB.getUid())).thenReturn(programStageB); - String sql = test("d2:daysBetween(#{ProgrmStagA.DataElmentC},#{ProgrmStagB.DataElmentD})"); - assertThat(sql, is("(cast(\"DataElmentD\" as date) - cast(\"DataElmentC\" as date))")); + String sql = test("d2:daysBetween(#{ProgrmStagA.DataElmentC},#{ProgrmStagA.DataElmentD})"); + assertThat( + sql, + is( + "(cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date) - " + + "cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentC\" else null end as date))")); } @Test @@ -385,7 +398,9 @@ void testHasValueDataElement() { when(programStageService.getProgramStage(programStageA.getUid())).thenReturn(programStageA); String sql = test("d2:hasValue(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("(\"DataElmentA\" is not null)")); + assertThat( + sql, + is("(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end is not null)")); } @Test @@ -402,13 +417,13 @@ void testMinutesBetween() { when(idObjectManager.get(DataElement.class, dataElementC.getUid())).thenReturn(dataElementC); when(idObjectManager.get(DataElement.class, dataElementD.getUid())).thenReturn(dataElementD); when(programStageService.getProgramStage(programStageA.getUid())).thenReturn(programStageA); - when(programStageService.getProgramStage(programStageB.getUid())).thenReturn(programStageB); - String sql = test("d2:minutesBetween(#{ProgrmStagA.DataElmentC},#{ProgrmStagB.DataElmentD})"); + String sql = test("d2:minutesBetween(#{ProgrmStagA.DataElmentC},#{ProgrmStagA.DataElmentD})"); assertThat( sql, is( - "(extract(epoch from (cast(\"DataElmentD\" as timestamp) - cast(\"DataElmentC\" as timestamp))) / 60)")); + "(extract(epoch from (cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as timestamp) " + + "- cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentC\" else null end as timestamp))) / 60)")); } @Test @@ -416,15 +431,16 @@ void testMonthsBetween() { when(idObjectManager.get(DataElement.class, dataElementC.getUid())).thenReturn(dataElementC); when(idObjectManager.get(DataElement.class, dataElementD.getUid())).thenReturn(dataElementD); when(programStageService.getProgramStage(programStageA.getUid())).thenReturn(programStageA); - when(programStageService.getProgramStage(programStageB.getUid())).thenReturn(programStageB); - String sql = test("d2:monthsBetween(#{ProgrmStagA.DataElmentC},#{ProgrmStagB.DataElmentD})"); + String sql = test("d2:monthsBetween(#{ProgrmStagA.DataElmentC},#{ProgrmStagA.DataElmentD})"); assertThat( sql, is( - "((date_part('year',age(cast(\"DataElmentD\" as date), cast(\"DataElmentC\" as date)))) * 12 + " - + "date_part('month',age(cast(\"DataElmentD\" as date), cast(\"DataElmentC\" as date))))")); + "((date_part('year',age(cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date), " + + "cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentC\" else null end as date)))) * 12 + " + + "date_part('month',age(cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date), " + + "cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentC\" else null end as date))))")); } @Test @@ -433,7 +449,10 @@ void testOizp() { when(programStageService.getProgramStage(programStageA.getUid())).thenReturn(programStageA); String sql = test("66 + d2:oizp(#{ProgrmStagA.DataElmentA} + 4)"); - assertThat(sql, is("66 + coalesce(case when \"DataElmentA\" + 4 >= 0 then 1 else 0 end, 0)")); + assertThat( + sql, + is( + "66 + coalesce(case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end + 4 >= 0 then 1 else 0 end, 0)")); } @Test @@ -468,10 +487,13 @@ void testWeeksBetween() { when(idObjectManager.get(DataElement.class, dataElementC.getUid())).thenReturn(dataElementC); when(idObjectManager.get(DataElement.class, dataElementD.getUid())).thenReturn(dataElementD); when(programStageService.getProgramStage(programStageA.getUid())).thenReturn(programStageA); - when(programStageService.getProgramStage(programStageB.getUid())).thenReturn(programStageB); - String sql = test("d2:weeksBetween(#{ProgrmStagA.DataElmentC},#{ProgrmStagB.DataElmentD})"); - assertThat(sql, is("((cast(\"DataElmentD\" as date) - cast(\"DataElmentC\" as date))/7)")); + String sql = test("d2:weeksBetween(#{ProgrmStagA.DataElmentC},#{ProgrmStagA.DataElmentD})"); + assertThat( + sql, + is( + "((cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date) - " + + "cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentC\" else null end as date))/7)")); } @Test @@ -521,7 +543,10 @@ void testZing() { when(idObjectManager.get(DataElement.class, dataElementA.getUid())).thenReturn(dataElementA); String sql = test("d2:zing(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("greatest(0,coalesce(\"DataElmentA\"::numeric,0))")); + assertThat( + sql, + is( + "greatest(0,coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0))")); } @Test @@ -534,7 +559,7 @@ void testZpvcOneArg() { sql, is( "nullif(cast((" - + "case when \"DataElmentA\" >= 0 then 1 else 0 end" + + "case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end >= 0 then 1 else 0 end" + ") as double precision),0)")); } @@ -549,8 +574,8 @@ void testZpvcTwoArgs() { sql, is( "nullif(cast((" - + "case when \"DataElmentA\" >= 0 then 1 else 0 end + " - + "case when \"DataElmentB\" >= 0 then 1 else 0 end" + + "case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end >= 0 then 1 else 0 end + " + + "case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentB\" else null end >= 0 then 1 else 0 end" + ") as double precision),0)")); } @@ -580,7 +605,10 @@ void testVectorAvg() { when(idObjectManager.get(DataElement.class, dataElementA.getUid())).thenReturn(dataElementA); String sql = test("avg(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("avg(coalesce(\"DataElmentA\"::numeric,0))")); + assertThat( + sql, + is( + "avg(coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0))")); } @Test @@ -589,10 +617,16 @@ void testVectorCount() { when(idObjectManager.get(DataElement.class, dataElementA.getUid())).thenReturn(dataElementA); String sql = test("count(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("count(coalesce(\"DataElmentA\"::numeric,0))")); + assertThat( + sql, + is( + "count(coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0))")); String sql2 = test("count(distinct #{ProgrmStagA.DataElmentA})"); - assertThat(sql2, is("count(distinct coalesce(\"DataElmentA\"::numeric,0))")); + assertThat( + sql2, + is( + "count(distinct coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0))")); } @Test @@ -601,7 +635,10 @@ void testVectorMax() { when(idObjectManager.get(DataElement.class, dataElementA.getUid())).thenReturn(dataElementA); String sql = test("max(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("max(coalesce(\"DataElmentA\"::numeric,0))")); + assertThat( + sql, + is( + "max(coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0))")); } @Test @@ -610,7 +647,10 @@ void testVectorMin() { when(idObjectManager.get(DataElement.class, dataElementA.getUid())).thenReturn(dataElementA); String sql = test("min(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("min(coalesce(\"DataElmentA\"::numeric,0))")); + assertThat( + sql, + is( + "min(coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0))")); } @Test @@ -619,7 +659,10 @@ void testVectorStddev() { when(idObjectManager.get(DataElement.class, dataElementA.getUid())).thenReturn(dataElementA); String sql = test("stddev(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("stddev_samp(coalesce(\"DataElmentA\"::numeric,0))")); + assertThat( + sql, + is( + "stddev_samp(coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0))")); } @Test @@ -628,7 +671,10 @@ void testVectorSum() { when(idObjectManager.get(DataElement.class, dataElementA.getUid())).thenReturn(dataElementA); String sql = test("sum(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("sum(coalesce(\"DataElmentA\"::numeric,0))")); + assertThat( + sql, + is( + "sum(coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0))")); } @Test @@ -637,7 +683,10 @@ void testVectorVariance() { when(idObjectManager.get(DataElement.class, dataElementA.getUid())).thenReturn(dataElementA); String sql = test("variance(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("variance(coalesce(\"DataElmentA\"::numeric,0))")); + assertThat( + sql, + is( + "variance(coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0))")); } @Test diff --git a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorItemsTest.java b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorItemsTest.java index fcc6b5606999..a1b0c8df181c 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorItemsTest.java +++ b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorItemsTest.java @@ -140,7 +140,10 @@ void testDataElement() { when(programStageService.getProgramStage(programStageA.getUid())).thenReturn(programStageA); String sql = test("#{ProgrmStagA.DataElmentA}"); - assertThat(sql, is("coalesce(\"DataElmentA\"::numeric,0)")); + assertThat( + sql, + is( + "coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0)")); } @Test @@ -149,7 +152,10 @@ void testDataElementAllowingNulls() { when(programStageService.getProgramStage(programStageA.getUid())).thenReturn(programStageA); String sql = test("d2:oizp(#{ProgrmStagA.DataElmentA})"); - assertThat(sql, is("coalesce(case when \"DataElmentA\" >= 0 then 1 else 0 end, 0)")); + assertThat( + sql, + is( + "coalesce(case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end >= 0 then 1 else 0 end, 0)")); } @Test diff --git a/dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/AbstractStatementBuilder.java b/dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/AbstractStatementBuilder.java index 9cc06a039cbd..0542f74bc987 100644 --- a/dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/AbstractStatementBuilder.java +++ b/dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/AbstractStatementBuilder.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.jdbc.statementbuilder; +import static java.lang.String.format; import static org.apache.commons.lang3.StringUtils.SPACE; import static org.hisp.dhis.program.AnalyticsPeriodBoundary.DB_ENROLLMENT_DATE; import static org.hisp.dhis.program.AnalyticsPeriodBoundary.DB_EVENT_DATE; @@ -303,7 +304,7 @@ public String getProgramIndicatorDataValueSelectSql( return getProgramIndicatorEventColumnSql( programStageUid, columnName, reportingStartDate, reportingEndDate, programIndicator); } else { - return columnName; + return getProgramIndicatorDataElementInEventSelectSql(columnName, programStageUid); } } @@ -339,10 +340,15 @@ public String getProgramIndicatorEventColumnSql( reportingEndDate, programIndicator); } else { - return columnName; + return getProgramIndicatorDataElementInEventSelectSql(columnName, programStageUid); } } + private String getProgramIndicatorDataElementInEventSelectSql( + String columnName, String programStageUid) { + return format("case when ax.\"ps\" = '%s' then %s else null end", programStageUid, columnName); + } + private String getProgramIndicatorEventInEnrollmentSelectSql( String columnName, String programStageUid, diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/aggregate/AnalyticsQueryDv8AutoTest.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/aggregate/AnalyticsQueryDv8AutoTest.java index a09a8c117235..4e3b79bc2829 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/aggregate/AnalyticsQueryDv8AutoTest.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/aggregate/AnalyticsQueryDv8AutoTest.java @@ -460,18 +460,6 @@ public void queryChildHealthAndInpatientIndicators() throws JSONException { validateRow(response, List.of("hCYU0G5Ti2T", "202109", "0.51", "", "", "", "", "")); validateRow(response, List.of("hCYU0G5Ti2T", "202111", "0.52", "", "", "", "", "")); validateRow(response, List.of("hCYU0G5Ti2T", "202101", "0.5", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202107", "1.47", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202103", "1.35", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202112", "1.48", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202104", "1.43", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202106", "1.42", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202108", "1.4", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202102", "1.44", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202105", "1.45", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202110", "1.38", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202109", "1.41", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202111", "1.45", "", "", "", "", "")); - validateRow(response, List.of("rXoaHGAXWy9", "202101", "1.1", "", "", "", "", "")); validateRow(response, List.of("fM7RZGVndZE", "202107", "1.0", "", "", "", "", "")); validateRow(response, List.of("fM7RZGVndZE", "202103", "0.97", "", "", "", "", "")); validateRow(response, List.of("fM7RZGVndZE", "202112", "1.0", "", "", "", "", "")); diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/enrollment/query/EnrollmentsQuery2AutoTest.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/enrollment/query/EnrollmentsQuery2AutoTest.java index d043ec764b6c..d8c5950441a4 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/enrollment/query/EnrollmentsQuery2AutoTest.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/enrollment/query/EnrollmentsQuery2AutoTest.java @@ -477,14 +477,14 @@ public void queryRandom8() throws JSONException { .validate() .statusCode(200) .body("headers", hasSize(equalTo(11))) - .body("rows", hasSize(equalTo(100))) - .body("height", equalTo(100)) - .body("width", equalTo(11)) + .body("rows", hasSize(equalTo(0))) + .body("height", equalTo(0)) + .body("width", equalTo(0)) .body("headerWidth", equalTo(11)); // Assert metaData. String expectedMetaData = - "{\"pager\":{\"page\":1,\"pageSize\":100,\"isLastPage\":false},\"items\":{\"X8zyunlgUfM\":{\"uid\":\"X8zyunlgUfM\",\"code\":\"DE_2006103\",\"name\":\"MCH Infant Feeding\",\"dimensionItemType\":\"DATA_ELEMENT\",\"valueType\":\"TEXT\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"Mnp3oXrpAbK\":{\"uid\":\"Mnp3oXrpAbK\",\"code\":\"Female\",\"name\":\"Female\"},\"IpHINAT79UW\":{\"uid\":\"IpHINAT79UW\",\"name\":\"Child Programme\"},\"ZzYYXq4fJie\":{\"uid\":\"ZzYYXq4fJie\",\"name\":\"Baby Postnatal\",\"description\":\"Baby Postnatal\"},\"ou\":{\"uid\":\"ou\",\"name\":\"Organisation unit\",\"dimensionType\":\"ORGANISATION_UNIT\"},\"w75KJ2mc4zz\":{\"uid\":\"w75KJ2mc4zz\",\"code\":\"MMD_PER_NAM\",\"name\":\"First name\",\"description\":\"First name\",\"dimensionItemType\":\"PROGRAM_ATTRIBUTE\",\"valueType\":\"TEXT\",\"aggregationType\":\"NONE\",\"totalAggregationType\":\"SUM\"},\"LAST_5_YEARS\":{\"name\":\"Last 5 years\"},\"MAs88nJc9nL\":{\"uid\":\"MAs88nJc9nL\",\"code\":\"Private Clinic\",\"name\":\"Private Clinic\",\"dimensionItemType\":\"ORGANISATION_UNIT_GROUP\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"},\"eo73fim1b2i\":{\"uid\":\"eo73fim1b2i\",\"name\":\"Measles + Yellow fever doses female\",\"dimensionItemType\":\"PROGRAM_INDICATOR\",\"valueType\":\"NUMBER\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"bS16xfd2E1F\":{\"uid\":\"bS16xfd2E1F\",\"code\":\"Exclusive\",\"name\":\"Exclusive\"},\"cejWyOfXge6\":{\"uid\":\"cejWyOfXge6\",\"name\":\"Gender\",\"description\":\"Gender\",\"dimensionItemType\":\"PROGRAM_ATTRIBUTE\",\"valueType\":\"TEXT\",\"aggregationType\":\"NONE\",\"totalAggregationType\":\"SUM\"},\"ImspTQPwCqd\":{\"uid\":\"ImspTQPwCqd\",\"code\":\"OU_525\",\"name\":\"Sierra Leone\",\"dimensionItemType\":\"ORGANISATION_UNIT\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"},\"tt54DiKuQ9c\":{\"uid\":\"tt54DiKuQ9c\",\"name\":\"Measles + Yellow fever doses low infant weight\",\"dimensionItemType\":\"PROGRAM_INDICATOR\",\"valueType\":\"NUMBER\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"2018\":{\"name\":\"2018\"},\"rXoaHGAXWy9\":{\"uid\":\"rXoaHGAXWy9\",\"name\":\"Health immunization score\",\"description\":\"Sum of BCG doses, measles doses and yellow fever doses. If Apgar score over or equal to 2, multiply by 2.\",\"dimensionItemType\":\"PROGRAM_INDICATOR\",\"valueType\":\"NUMBER\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"odMfnhhpjUj\":{\"uid\":\"odMfnhhpjUj\",\"code\":\"Mixed\",\"name\":\"Mixed\"},\"A03MvHHogjR\":{\"uid\":\"A03MvHHogjR\",\"name\":\"Birth\",\"description\":\"Birth of the baby\"},\"fLCgjvxrw4c\":{\"uid\":\"fLCgjvxrw4c\",\"code\":\"Replacement\",\"name\":\"Replacement\"},\"A03MvHHogjR.X8zyunlgUfM\":{\"uid\":\"X8zyunlgUfM\",\"code\":\"DE_2006103\",\"name\":\"MCH Infant Feeding\",\"dimensionItemType\":\"DATA_ELEMENT\",\"valueType\":\"TEXT\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"fM7RZGVndZE\":{\"uid\":\"fM7RZGVndZE\",\"name\":\"Measles + Yellow fever doses\",\"dimensionItemType\":\"PROGRAM_INDICATOR\",\"valueType\":\"NUMBER\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"PVLOW4bCshG\":{\"uid\":\"PVLOW4bCshG\",\"code\":\"NGO\",\"name\":\"NGO\",\"dimensionItemType\":\"ORGANISATION_UNIT_GROUP\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"},\"oRVt7g429ZO\":{\"uid\":\"oRVt7g429ZO\",\"code\":\"Public facilities\",\"name\":\"Public facilities\",\"dimensionItemType\":\"ORGANISATION_UNIT_GROUP\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"},\"Bpx0589u8y0\":{\"uid\":\"Bpx0589u8y0\",\"name\":\"Facility Ownership\",\"dimensionType\":\"ORGANISATION_UNIT_GROUP_SET\"},\"w0gFTTmsUcF\":{\"uid\":\"w0gFTTmsUcF\",\"code\":\"Mission\",\"name\":\"Mission\",\"dimensionItemType\":\"ORGANISATION_UNIT_GROUP\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"}},\"dimensions\":{\"tt54DiKuQ9c\":[],\"rXoaHGAXWy9\":[],\"pe\":[],\"ou\":[\"ImspTQPwCqd\"],\"w75KJ2mc4zz\":[],\"A03MvHHogjR.X8zyunlgUfM\":[\"bS16xfd2E1F\",\"fLCgjvxrw4c\",\"odMfnhhpjUj\"],\"fM7RZGVndZE\":[],\"Bpx0589u8y0\":[\"MAs88nJc9nL\",\"PVLOW4bCshG\",\"w0gFTTmsUcF\",\"oRVt7g429ZO\"],\"eo73fim1b2i\":[],\"cejWyOfXge6\":[\"Mnp3oXrpAbK\"]}}"; + "{\"pager\":{\"page\":1,\"pageSize\":100,\"isLastPage\":true},\"items\":{\"2018\":{\"name\":\"2018\"},\"X8zyunlgUfM\":{\"uid\":\"X8zyunlgUfM\",\"code\":\"DE_2006103\",\"name\":\"MCH Infant Feeding\",\"dimensionItemType\":\"DATA_ELEMENT\",\"valueType\":\"TEXT\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"Mnp3oXrpAbK\":{\"uid\":\"Mnp3oXrpAbK\",\"code\":\"Female\",\"name\":\"Female\"},\"IpHINAT79UW\":{\"uid\":\"IpHINAT79UW\",\"name\":\"Child Programme\"},\"ZzYYXq4fJie\":{\"uid\":\"ZzYYXq4fJie\",\"name\":\"Baby Postnatal\",\"description\":\"Baby Postnatal\"},\"ou\":{\"uid\":\"ou\",\"name\":\"Organisation unit\",\"dimensionType\":\"ORGANISATION_UNIT\"},\"w75KJ2mc4zz\":{\"uid\":\"w75KJ2mc4zz\",\"code\":\"MMD_PER_NAM\",\"name\":\"First name\",\"description\":\"First name\",\"dimensionItemType\":\"PROGRAM_ATTRIBUTE\",\"valueType\":\"TEXT\",\"aggregationType\":\"NONE\",\"totalAggregationType\":\"SUM\"},\"LAST_5_YEARS\":{\"name\":\"Last 5 years\"},\"MAs88nJc9nL\":{\"uid\":\"MAs88nJc9nL\",\"code\":\"Private Clinic\",\"name\":\"Private Clinic\",\"dimensionItemType\":\"ORGANISATION_UNIT_GROUP\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"},\"eo73fim1b2i\":{\"uid\":\"eo73fim1b2i\",\"name\":\"Measles + Yellow fever doses female\",\"dimensionItemType\":\"PROGRAM_INDICATOR\",\"valueType\":\"NUMBER\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"cejWyOfXge6\":{\"uid\":\"cejWyOfXge6\",\"name\":\"Gender\",\"description\":\"Gender\",\"dimensionItemType\":\"PROGRAM_ATTRIBUTE\",\"valueType\":\"TEXT\",\"aggregationType\":\"NONE\",\"totalAggregationType\":\"SUM\"},\"ImspTQPwCqd\":{\"uid\":\"ImspTQPwCqd\",\"code\":\"OU_525\",\"name\":\"Sierra Leone\",\"dimensionItemType\":\"ORGANISATION_UNIT\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"},\"tt54DiKuQ9c\":{\"uid\":\"tt54DiKuQ9c\",\"name\":\"Measles + Yellow fever doses low infant weight\",\"dimensionItemType\":\"PROGRAM_INDICATOR\",\"valueType\":\"NUMBER\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"rXoaHGAXWy9\":{\"uid\":\"rXoaHGAXWy9\",\"name\":\"Health immunization score\",\"description\":\"Sum of BCG doses, measles doses and yellow fever doses. If Apgar score over or equal to 2, multiply by 2.\",\"dimensionItemType\":\"PROGRAM_INDICATOR\",\"valueType\":\"NUMBER\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"A03MvHHogjR\":{\"uid\":\"A03MvHHogjR\",\"name\":\"Birth\",\"description\":\"Birth of the baby\"},\"pC3N9N77UmT\":{\"uid\":\"pC3N9N77UmT\",\"name\":\"Gender\",\"options\":[{\"uid\":\"Mnp3oXrpAbK\",\"code\":\"Female\"}]},\"A03MvHHogjR.X8zyunlgUfM\":{\"uid\":\"X8zyunlgUfM\",\"code\":\"DE_2006103\",\"name\":\"MCH Infant Feeding\",\"dimensionItemType\":\"DATA_ELEMENT\",\"valueType\":\"TEXT\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"fM7RZGVndZE\":{\"uid\":\"fM7RZGVndZE\",\"name\":\"Measles + Yellow fever doses\",\"dimensionItemType\":\"PROGRAM_INDICATOR\",\"valueType\":\"NUMBER\",\"aggregationType\":\"AVERAGE\",\"totalAggregationType\":\"SUM\"},\"PVLOW4bCshG\":{\"uid\":\"PVLOW4bCshG\",\"code\":\"NGO\",\"name\":\"NGO\",\"dimensionItemType\":\"ORGANISATION_UNIT_GROUP\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"},\"oRVt7g429ZO\":{\"uid\":\"oRVt7g429ZO\",\"code\":\"Public facilities\",\"name\":\"Public facilities\",\"dimensionItemType\":\"ORGANISATION_UNIT_GROUP\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"},\"Bpx0589u8y0\":{\"uid\":\"Bpx0589u8y0\",\"name\":\"Facility Ownership\",\"dimensionType\":\"ORGANISATION_UNIT_GROUP_SET\"},\"w0gFTTmsUcF\":{\"uid\":\"w0gFTTmsUcF\",\"code\":\"Mission\",\"name\":\"Mission\",\"dimensionItemType\":\"ORGANISATION_UNIT_GROUP\",\"valueType\":\"NUMBER\",\"totalAggregationType\":\"SUM\"}},\"dimensions\":{\"tt54DiKuQ9c\":[],\"rXoaHGAXWy9\":[],\"pe\":[],\"ou\":[\"ImspTQPwCqd\"],\"w75KJ2mc4zz\":[],\"A03MvHHogjR.X8zyunlgUfM\":[\"Mnp3oXrpAbK\"],\"fM7RZGVndZE\":[],\"Bpx0589u8y0\":[\"MAs88nJc9nL\",\"PVLOW4bCshG\",\"oRVt7g429ZO\",\"w0gFTTmsUcF\"],\"eo73fim1b2i\":[],\"cejWyOfXge6\":[\"Mnp3oXrpAbK\"]}}"; String actualMetaData = new JSONObject((Map) response.extract("metaData")).toString(); assertEquals(expectedMetaData, actualMetaData, false); @@ -552,1507 +552,5 @@ public void queryRandom8() throws JSONException { "java.time.LocalDate", false, true); - - // Assert rows. - validateRow( - response, - 0, - List.of( - "Ngolahun Jabaty MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:18.293", - "3", - "1", - "1", - "1", - "Exclusive", - "Female", - "Theresa", - "2023-05-09 12:05:00.0")); - validateRow( - response, - 1, - List.of( - "Samaia MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:18.418", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Evelyn", - "2023-04-01 12:05:00.0")); - validateRow( - response, - 2, - List.of( - "Konjo (Dama) CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:18.464", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Wanda", - "2023-08-26 12:05:00.0")); - validateRow( - response, - 3, - List.of( - "Rotifunk CHC", - "oRVt7g429ZO", - "2018-08-07 15:47:18.614", - "3", - "1", - "1", - "1", - "Mixed", - "Female", - "Jessica", - "2023-10-02 12:05:00.0")); - validateRow( - response, - 4, - List.of( - "Praise Foundation CHC", - "PVLOW4bCshG", - "2018-08-07 15:47:18.717", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Amy", - "2023-02-05 12:05:00.0")); - validateRow( - response, - 5, - List.of( - "Dodo Kortuma CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:18.897", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Alice", - "2023-07-17 12:05:00.0")); - validateRow( - response, - 6, - List.of( - "Massahun MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:18.946", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Ruth", - "2023-09-11 12:05:00.0")); - validateRow( - response, - 7, - List.of( - "Nyangbe-Bo MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:18.999", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Catherine", - "2023-04-13 12:05:00.0")); - validateRow( - response, - 8, - List.of( - "Sandaru CHC", - "oRVt7g429ZO", - "2018-08-07 15:47:19.077", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Patricia", - "2023-06-19 12:05:00.0")); - validateRow( - response, - 9, - List.of( - "Sawuria CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.16", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Betty", - "2023-04-16 12:05:00.0")); - validateRow( - response, - 10, - List.of( - "Kissy Health Centre", - "oRVt7g429ZO", - "2018-08-07 15:47:19.173", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Karen", - "2023-02-14 12:05:00.0")); - validateRow( - response, - 11, - List.of( - "Mayossoh MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.557", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Tammy", - "2023-03-13 12:05:00.0")); - validateRow( - response, - 12, - List.of( - "Yakaji MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.588", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Cynthia", - "2023-03-19 12:05:00.0")); - validateRow( - response, - 13, - List.of( - "Konia MCHP", - "", - "2018-08-07 15:47:19.601", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Diane", - "2023-09-05 12:05:00.0")); - validateRow( - response, - 14, - List.of( - "Magbass MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.609", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Michelle", - "2023-05-15 12:05:00.0")); - validateRow( - response, - 15, - List.of( - "Rina Clinic", - "", - "2018-08-07 15:47:19.767", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Christina", - "2023-04-26 12:05:00.0")); - validateRow( - response, - 16, - List.of( - "Kamba Mamudia MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.836", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Brenda", - "2023-11-15 12:05:00.0")); - validateRow( - response, - 17, - List.of( - "Rokel (Masimera) MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.847", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Donna", - "2023-08-22 12:05:00.0")); - validateRow( - response, - 18, - List.of( - "Mayakie MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.869", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Sharon", - "2023-08-18 12:05:00.0")); - validateRow( - response, - 19, - List.of( - "Makeni-Rokfullah MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.908", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Phyllis", - "2023-01-16 12:05:00.0")); - validateRow( - response, - 20, - List.of( - "Follah MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.928", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Kathleen", - "2023-04-11 12:05:00.0")); - validateRow( - response, - 21, - List.of( - "Sukudu Soa MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.941", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Evelyn", - "2023-06-05 12:05:00.0")); - validateRow( - response, - 22, - List.of( - "Nyandeyaima MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:19.944", - "3", - "1", - "1", - "1", - "Mixed", - "Female", - "Tammy", - "2023-06-28 12:05:00.0")); - validateRow( - response, - 23, - List.of( - "Serabu (Bumpe Ngao) UFC", - "oRVt7g429ZO", - "2018-08-07 15:47:19.956", - "3", - "1", - "1", - "1", - "Mixed", - "Female", - "Jennifer", - "2023-04-02 12:05:00.0")); - validateRow( - response, - 24, - List.of( - "Makobeh MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.022", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Elizabeth", - "2023-03-23 12:05:00.0")); - validateRow( - response, - 25, - List.of( - "Gbo-Lambayama 1 MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.031", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Paula", - "2023-04-13 12:05:00.0")); - validateRow( - response, - 26, - List.of( - "Juma MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.037", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Lori", - "2023-12-04 12:05:00.0")); - validateRow( - response, - 27, - List.of( - "Gbaa (Makpele) CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.09", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Heather", - "2023-09-25 12:05:00.0")); - validateRow( - response, - 28, - List.of( - "Rokolon MCHP", - "", - "2018-08-07 15:47:20.137", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Patricia", - "2023-09-20 12:05:00.0")); - validateRow( - response, - 29, - List.of( - "John Thorpe MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.2", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Judith", - "2023-01-28 12:05:00.0")); - validateRow( - response, - 30, - List.of( - "Koya MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.343", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Jacqueline", - "2023-01-22 12:05:00.0")); - validateRow( - response, - 31, - List.of( - "Mabineh MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.371", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Judy", - "2023-03-24 12:05:00.0")); - validateRow( - response, - 32, - List.of( - "Melekuray CHC", - "oRVt7g429ZO", - "2018-08-07 15:47:20.42", - "3", - "1", - "1", - "1", - "Replacement", - "Female", - "Jennifer", - "2023-11-22 12:05:00.0")); - validateRow( - response, - 33, - List.of( - "MCH Static/U5", - "oRVt7g429ZO", - "2018-08-07 15:47:20.434", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Carol", - "2023-10-14 12:05:00.0")); - validateRow( - response, - 34, - List.of( - "Komende (Kaiyamba) MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.454", - "3", - "1", - "1", - "1", - "Replacement", - "Female", - "Maria", - "2023-06-26 12:05:00.0")); - validateRow( - response, - 35, - List.of( - "Maforay MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.623", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Stephanie", - "2023-03-04 12:05:00.0")); - validateRow( - response, - 36, - List.of( - "Mawoma MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:20.774", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Annie", - "2023-10-21 12:05:00.0")); - validateRow( - response, - 37, - List.of( - "Gboyama CHC", - "oRVt7g429ZO", - "2018-08-07 15:47:20.858", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Irene", - "2023-04-14 12:05:00.0")); - validateRow( - response, - 38, - List.of( - "Blessed Mokaba clinic", - "oRVt7g429ZO", - "2018-08-07 15:47:20.904", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Sarah", - "2023-10-23 12:05:00.0")); - validateRow( - response, - 39, - List.of( - "Koidu Under Five Clinic", - "oRVt7g429ZO", - "2018-08-07 15:47:20.945", - "3", - "1", - "1", - "1", - "Replacement", - "Female", - "Joyce", - "2023-09-06 12:05:00.0")); - validateRow( - response, - 40, - List.of( - "Potoru CHC", - "oRVt7g429ZO", - "2018-08-07 15:47:21.057", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Nicole", - "2023-04-14 12:05:00.0")); - validateRow( - response, - 41, - List.of( - "Minah MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.077", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Martha", - "2023-07-30 12:05:00.0")); - validateRow( - response, - 42, - List.of( - "Saama (Lower Bamabara) CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.286", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Norma", - "2023-05-29 12:05:00.0")); - validateRow( - response, - 43, - List.of( - "Baptist Centre Kassirie", - "", - "2018-08-07 15:47:21.288", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Joyce", - "2023-11-14 12:05:00.0")); - validateRow( - response, - 44, - List.of( - "Jendema CHC", - "oRVt7g429ZO", - "2018-08-07 15:47:21.363", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Cheryl", - "2023-01-17 12:05:00.0")); - validateRow( - response, - 45, - List.of( - "Pejewa MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.399", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Marie", - "2023-03-06 12:05:00.0")); - validateRow( - response, - 46, - List.of( - "Kania MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.433", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Diana", - "2023-07-16 12:05:00.0")); - validateRow( - response, - 47, - List.of( - "Mamankie MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.443", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Katherine", - "2023-05-01 12:05:00.0")); - validateRow( - response, - 48, - List.of( - "Banana Island MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.445", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Catherine", - "2023-05-18 12:05:00.0")); - validateRow( - response, - 49, - List.of( - "Makalie MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.449", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Julia", - "2023-08-13 12:05:00.0")); - validateRow( - response, - 50, - List.of( - "Foindu MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.455", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Emily", - "2023-08-03 12:05:00.0")); - validateRow( - response, - 51, - List.of( - "Hill Station MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.516", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Cynthia", - "2023-09-19 12:05:00.0")); - validateRow( - response, - 52, - List.of( - "Bangoma MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.565", - "3", - "1", - "1", - "1", - "Exclusive", - "Female", - "Judy", - "2023-03-24 12:05:00.0")); - validateRow( - response, - 53, - List.of( - "Wai MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.605", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Laura", - "2023-09-18 12:05:00.0")); - validateRow( - response, - 54, - List.of( - "Mapailleh MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.617", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Diana", - "2023-07-12 12:05:00.0")); - validateRow( - response, - 55, - List.of( - "Bradford CHC", - "oRVt7g429ZO", - "2018-08-07 15:47:21.665", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Lisa", - "2023-09-10 12:05:00.0")); - validateRow( - response, - 56, - List.of( - "Kantia CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.711", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Lori", - "2023-09-29 12:05:00.0")); - validateRow( - response, - 57, - List.of( - "Kalangba MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.854", - "3", - "1", - "1", - "1", - "Exclusive", - "Female", - "Maria", - "2023-06-29 12:05:00.0")); - validateRow( - response, - 58, - List.of( - "Kambia CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.867", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Jessica", - "2023-07-18 12:05:00.0")); - validateRow( - response, - 59, - List.of( - "Sam Lean's MCHP", - "MAs88nJc9nL", - "2018-08-07 15:47:21.905", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Pamela", - "2023-01-06 12:05:00.0")); - validateRow( - response, - 60, - List.of( - "Yoyema MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.944", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Susan", - "2023-01-09 12:05:00.0")); - validateRow( - response, - 61, - List.of( - "UFC Port Loko", - "oRVt7g429ZO", - "2018-08-07 15:47:21.95", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Tammy", - "2023-10-07 12:05:00.0")); - validateRow( - response, - 62, - List.of( - "Mano Sewallu CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.982", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Karen", - "2023-03-25 12:05:00.0")); - validateRow( - response, - 63, - List.of( - "Pelewahun (Baoma) MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:21.995", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Stephanie", - "2023-01-01 12:05:00.0")); - validateRow( - response, - 64, - List.of( - "Ngiewahun CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.03", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Angela", - "2023-11-28 12:05:00.0")); - validateRow( - response, - 65, - List.of( - "Mangay Loko MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.124", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Louise", - "2023-03-15 12:05:00.0")); - validateRow( - response, - 66, - List.of( - "Taninahun (Malen) CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.133", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Amy", - "2023-03-22 12:05:00.0")); - validateRow( - response, - 67, - List.of( - "Bandajuma Sinneh MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.159", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Brenda", - "2023-03-19 12:05:00.0")); - validateRow( - response, - 68, - List.of( - "Mabonkanie MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.169", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Katherine", - "2023-07-09 12:05:00.0")); - validateRow( - response, - 69, - List.of( - "Baiama CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.196", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Judy", - "2023-04-28 12:05:00.0")); - validateRow( - response, - 70, - List.of( - "Kumrabai Yoni MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.27", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Nicole", - "2023-07-12 12:05:00.0")); - validateRow( - response, - 71, - List.of( - "Gbonkoh Kareneh MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.283", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Anne", - "2023-05-28 12:05:00.0")); - validateRow( - response, - 72, - List.of( - "Feuror MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.349", - "3", - "1", - "1", - "1", - "Mixed", - "Female", - "Lillian", - "2023-11-05 12:05:00.0")); - validateRow( - response, - 73, - List.of( - "Kpayama 1 MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.397", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Debra", - "2023-07-29 12:05:00.0")); - validateRow( - response, - 74, - List.of( - "Arab Clinic", - "oRVt7g429ZO", - "2018-08-07 15:47:22.484", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Lori", - "2023-09-16 12:05:00.0")); - validateRow( - response, - 75, - List.of( - "Hamilton MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.489", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Paula", - "2023-02-07 12:05:00.0")); - validateRow( - response, - 76, - List.of( - "Njama MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.497", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Jane", - "2023-09-09 12:05:00.0")); - validateRow( - response, - 77, - List.of( - "Yengema CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.509", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Rose", - "2023-08-28 12:05:00.0")); - validateRow( - response, - 78, - List.of( - "Rapha Clinic", - "", - "2018-08-07 15:47:22.511", - "3", - "1", - "1", - "1", - "Mixed", - "Female", - "Janet", - "2023-11-17 12:05:00.0")); - validateRow( - response, - 79, - List.of( - "Approved School CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.539", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Amanda", - "2023-05-18 12:05:00.0")); - validateRow( - response, - 80, - List.of( - "Bandajuma Kpolihun CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.575", - "3", - "1", - "1", - "1", - "Exclusive", - "Female", - "Teresa", - "2023-01-11 12:05:00.0")); - validateRow( - response, - 81, - List.of( - "Doujou CHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.592", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Kimberly", - "2023-08-15 12:05:00.0")); - validateRow( - response, - 82, - List.of( - "Philip Street Clinic", - "oRVt7g429ZO", - "2018-08-07 15:47:22.6", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Carolyn", - "2023-11-30 12:05:00.0")); - validateRow( - response, - 83, - List.of( - "Yoyema MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.613", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Ruth", - "2023-02-24 12:05:00.0")); - validateRow( - response, - 84, - List.of( - "Rofutha MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.658", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Julia", - "2023-05-20 12:05:00.0")); - validateRow( - response, - 85, - List.of( - "Koindu-kuntey MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.684", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Emily", - "2023-01-06 12:05:00.0")); - validateRow( - response, - 86, - List.of( - "Mathinkalol MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.824", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Kathy", - "2023-09-05 12:05:00.0")); - validateRow( - response, - 87, - List.of( - "Gbaama MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.875", - "3", - "1", - "1", - "1", - "Exclusive", - "Female", - "Kimberly", - "2023-05-19 12:05:00.0")); - validateRow( - response, - 88, - List.of( - "Fothaneh Bana MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.883", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Ann", - "2023-06-20 12:05:00.0")); - validateRow( - response, - 89, - List.of( - "Kawaya MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.915", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Anna", - "2023-05-06 12:05:00.0")); - validateRow( - response, - 90, - List.of( - "St Anthony clinic", - "oRVt7g429ZO", - "2018-08-07 15:47:22.916", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Janice", - "2023-03-28 12:05:00.0")); - validateRow( - response, - 91, - List.of( - "Masofinia MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.956", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Rachel", - "2023-09-12 12:05:00.0")); - validateRow( - response, - 92, - List.of( - "Holy Mary Hospital", - "MAs88nJc9nL", - "2018-08-07 15:47:22.963", - "3", - "1", - "1", - "1", - "Replacement", - "Female", - "Kimberly", - "2023-01-21 12:05:00.0")); - validateRow( - response, - 93, - List.of( - "Gbalan Thallan MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:22.967", - "3", - "1", - "1", - "0", - "Mixed", - "Female", - "Linda", - "2023-01-16 12:05:00.0")); - validateRow( - response, - 94, - List.of( - "Mateboi CHC", - "oRVt7g429ZO", - "2018-08-07 15:47:22.976", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Joan", - "2023-11-04 12:05:00.0")); - validateRow( - response, - 95, - List.of( - "Mokassie MCHP", - "oRVt7g429ZO", - "2018-08-07 15:47:23.113", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Deborah", - "2023-02-14 12:05:00.0")); - validateRow( - response, - 96, - List.of( - "Leprosy & TB Hospital", - "oRVt7g429ZO", - "2018-08-07 15:47:23.124", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Sharon", - "2023-05-31 12:05:00.0")); - validateRow( - response, - 97, - List.of( - "UNIMUS MCHP", - "MAs88nJc9nL", - "2018-08-07 15:47:23.184", - "3", - "1", - "1", - "0", - "Replacement", - "Female", - "Karen", - "2023-06-20 12:05:00.0")); - validateRow( - response, - 98, - List.of( - "Moriba Town CHC", - "oRVt7g429ZO", - "2018-08-07 15:47:23.194", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Karen", - "2023-10-06 12:05:00.0")); - validateRow( - response, - 99, - List.of( - "Rokolon MCHP", - "", - "2018-08-07 15:47:23.215", - "3", - "1", - "1", - "0", - "Exclusive", - "Female", - "Nancy", - "2023-10-02 12:05:00.0")); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceD2FunctionTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceD2FunctionTest.java index 4fd367cf988a..1931f7add77f 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceD2FunctionTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceD2FunctionTest.java @@ -166,7 +166,8 @@ private String getSqlEnrollment(String expression) { @Test void testD2Condition() { assertEquals( - "case when ((\"DataElmentA\" is not null)) then 1 + 4 else nullif(cast((case when \"DataElmentB\" >= 0 then 1 else 0 end) as double precision),0) end", + "case when ((case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end is not null)) then 1 + 4 else " + + "nullif(cast((case when case when ax.\"ps\" = 'Program000B' then \"DataElmentB\" else null end >= 0 then 1 else 0 end) as double precision),0) end", getSql( "d2:condition( 'd2:hasValue(#{ProgrmStagA.DataElmentA})', 1+4, d2:zpvc(#{Program000B.DataElmentB}) )")); assertEquals( @@ -189,7 +190,9 @@ void testD2Count() { @Test void testD2CountIfCondition() { assertEquals( - "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" >= coalesce(\"DataElmentB\"::numeric,0) and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi " + + "and \"DataElmentA\" is not null and \"DataElmentA\" >= coalesce(case when ax.\"ps\" = 'Program000B' then \"DataElmentB\" else null end::numeric,0) " + + "and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSql( "d2:countIfCondition( #{ProgrmStagA.DataElmentA}, ' >= #{Program000B.DataElmentB}')")); assertEquals( @@ -213,7 +216,7 @@ void testD2CountIfValue() { @Test void testD2DaysBetween() { assertEquals( - "(cast(executiondate as date) - cast(\"DataElmentD\" as date))", + "(cast(executiondate as date) - cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date))", getSql("d2:daysBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( "(cast((select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date) " @@ -224,7 +227,8 @@ void testD2DaysBetween() { @Test void testD2HasValue() { assertEquals( - "(\"DataElmentA\" is not null)", getSql("d2:hasValue(#{ProgrmStagA.DataElmentA})")); + "(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end is not null)", + getSql("d2:hasValue(#{ProgrmStagA.DataElmentA})")); assertEquals( "((select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) is not null)", getSqlEnrollment("d2:hasValue(#{ProgrmStagA.DataElmentA})")); @@ -245,7 +249,7 @@ void testD2MaxValue() { @Test void testD2MinutesBetween() { assertEquals( - "(extract(epoch from (cast(executiondate as timestamp) - cast(\"DataElmentD\" as timestamp))) / 60)", + "(extract(epoch from (cast(executiondate as timestamp) - cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as timestamp))) / 60)", getSql("d2:minutesBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( "(extract(epoch from (cast((select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as timestamp) " @@ -269,7 +273,8 @@ void testD2MinValue() { @Test void testD2MonthsBetween() { assertEquals( - "((date_part('year',age(cast(executiondate as date), cast(\"DataElmentD\" as date)))) * 12 + date_part('month',age(cast(executiondate as date), cast(\"DataElmentD\" as date))))", + "((date_part('year',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date)))) * 12 " + + "+ date_part('month',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date))))", getSql("d2:monthsBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( "((date_part('year',age(cast((select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date), " @@ -282,10 +287,11 @@ void testD2MonthsBetween() { @Test void testD2Oizp() { assertEquals( - "((date_part('year',age(cast(executiondate as date), cast(\"DataElmentA\" as date)))) * 12 + date_part('month',age(cast(executiondate as date), cast(\"DataElmentA\" as date))))", + "((date_part('year',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date)))) * 12 " + + "+ date_part('month',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date))))", getSql("d2:monthsBetween(#{ProgrmStagA.DataElmentA}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( - "coalesce(case when \"DataElmentA\" >= 0 then 1 else 0 end, 0)", + "coalesce(case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end >= 0 then 1 else 0 end, 0)", getSql("d2:oizp(#{ProgrmStagA.DataElmentA})")); assertEquals( "coalesce(case when (select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) >= 0 then 1 else 0 end, 0)", @@ -311,7 +317,7 @@ void testD2RelationshipCount() { @Test void testD2WeeksBetween() { assertEquals( - "((cast(executiondate as date) - cast(\"DataElmentA\" as date))/7)", + "((cast(executiondate as date) - cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date))/7)", getSql("d2:weeksBetween(#{ProgrmStagA.DataElmentA}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( "((cast((select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date) " @@ -322,7 +328,7 @@ void testD2WeeksBetween() { @Test void testD2YearsBetween() { assertEquals( - "(date_part('year',age(cast(executiondate as date), cast(\"DataElmentA\" as date))))", + "(date_part('year',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date))))", getSql("d2:yearsBetween(#{ProgrmStagA.DataElmentA}, PS_EVENTDATE:ProgrmStagA)")); var enrol = getSqlEnrollment("d2:yearsBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)"); @@ -340,7 +346,7 @@ void testD2YearsBetween() { @Test void testD2Zing() { assertEquals( - "greatest(0,coalesce(\"DataElmentA\"::numeric,0) + 5)", + "greatest(0,coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0) + 5)", getSql("d2:zing(#{ProgrmStagA.DataElmentA} + 5)")); assertEquals( "greatest(0,coalesce((select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 )::numeric,0) + 5)", @@ -350,8 +356,9 @@ void testD2Zing() { @Test void testD2Zpvc() { assertEquals( - "nullif(cast((case when \"DataElmentA\" >= 0 then 1 else 0 end + case when \"DataElmentB\" >= 0 then 1 else 0 end) as double precision),0)", - getSql("d2:zpvc(#{ProgrmStagA.DataElmentA},#{ProgrmStagB.DataElmentB})")); + "nullif(cast((case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end >= 0 then 1 else 0 end " + + "+ case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentB\" else null end >= 0 then 1 else 0 end) as double precision),0)", + getSql("d2:zpvc(#{ProgrmStagA.DataElmentA},#{ProgrmStagA.DataElmentB})")); assertEquals( "nullif(cast((case when (select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) >= 0 then 1 else 0 end " + "+ case when (select \"DataElmentB\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentB\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagB' order by executiondate desc limit 1 ) >= 0 then 1 else 0 end) as double precision),0)", diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java index 133b586ddd53..b29b162f61e9 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.program; +import static java.lang.String.format; import static org.hisp.dhis.analytics.DataType.BOOLEAN; import static org.hisp.dhis.analytics.DataType.NUMERIC; import static org.hisp.dhis.program.ProgramIndicator.KEY_ATTRIBUTE; @@ -475,11 +476,9 @@ void testGetAnyValueExistsFilterEnrollmentAnalyticsSQl() { @Test void testGetAnalyticsSQl() { String expected = - "coalesce(\"" - + deAInteger.getUid() - + "\"::numeric,0) + coalesce(\"" - + atA.getUid() - + "\"::numeric,0) > 10"; + format( + "coalesce(case when ax.\"ps\" = '%s' then \"%s\" else null end::numeric,0) + coalesce(\"%s\"::numeric,0) > 10", + psA.getUid(), deAInteger.getUid(), atA.getUid()); assertEquals( expected, programIndicatorService.getAnalyticsSql( @@ -549,26 +548,29 @@ void testValidate() { @Test void testBooleanAsNumeric() { - assertEquals("coalesce(\"DataElmentG\"::numeric,0)", sql("#{ProgrmStagA.DataElmentG}")); + assertEquals( + "coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentG\" else null end::numeric,0)", + sql("#{ProgrmStagA.DataElmentG}")); } @Test void testBooleanAsBoolean() { assertEquals( - "coalesce(\"DataElmentG\"::numeric!=0,false)", filter("#{ProgrmStagA.DataElmentG}")); + "coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentG\" else null end::numeric!=0,false)", + filter("#{ProgrmStagA.DataElmentG}")); } @Test void testBooleanAsBooleanWithinIf() { assertEquals( - " case when coalesce(\"DataElmentG\"::numeric!=0,false) then 4 else 5 end", + " case when coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentG\" else null end::numeric!=0,false) then 4 else 5 end", sql("if(#{ProgrmStagA.DataElmentG},4,5)")); } @Test void testBooleanAsNumericWithinIf() { assertEquals( - " case when coalesce(\"DataElmentG\"::numeric,0) > 1 then 4 else 5 end", + " case when coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentG\" else null end::numeric,0) > 1 then 4 else 5 end", sql("if(#{ProgrmStagA.DataElmentG} > 1,4,5)")); } @@ -589,7 +591,8 @@ void testValueCount() { @Test void testComparisonOperator() { - String expected = "coalesce(\"DataElmentA\"::numeric,0) = 'Ongoing'"; + String expected = + "coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0) = 'Ongoing'"; String expression = "#{ProgrmStagA.DataElmentA} == 'Ongoing'"; assertEquals( expected, From b34f55ccd33d031707d756ff1636215b0fbf1405 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Oct 2023 08:41:27 +0100 Subject: [PATCH 06/63] chore(deps): bump jetty.version from 10.0.17 to 10.0.18 in /dhis-2 (#15543) Bumps `jetty.version` from 10.0.17 to 10.0.18. Updates `org.eclipse.jetty:jetty-rewrite` from 10.0.17 to 10.0.18 - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-10.0.17...jetty-10.0.18) Updates `org.eclipse.jetty:jetty-util` from 10.0.17 to 10.0.18 - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-10.0.17...jetty-10.0.18) Updates `org.eclipse.jetty:jetty-servlet` from 10.0.17 to 10.0.18 - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-10.0.17...jetty-10.0.18) Updates `org.eclipse.jetty:jetty-server` from 10.0.17 to 10.0.18 - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-10.0.17...jetty-10.0.18) --- updated-dependencies: - dependency-name: org.eclipse.jetty:jetty-rewrite dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.eclipse.jetty:jetty-util dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.eclipse.jetty:jetty-servlet dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.eclipse.jetty:jetty-server dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index dfb7df091f39..7494e6293188 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -175,7 +175,7 @@ 3.0.0 2.8.0 1.16.2 - 10.0.17 + 10.0.18 32.1.3-jre From ae47d185a9c54a2a7f4a734a7906cece04b2fc05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Oct 2023 08:02:41 +0000 Subject: [PATCH 07/63] chore(deps): bump geotools.version from 29.2 to 29.3 in /dhis-2 (#15544) Bumps `geotools.version` from 29.2 to 29.3. Updates `org.geotools:gt-render` from 29.2 to 29.3 Updates `org.geotools:gt-main` from 29.2 to 29.3 Updates `org.geotools:gt-geojson` from 29.2 to 29.3 Updates `org.geotools:gt-opengis` from 29.2 to 29.3 Updates `org.geotools:gt-referencing` from 29.2 to 29.3 --- updated-dependencies: - dependency-name: org.geotools:gt-render dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.geotools:gt-main dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.geotools:gt-geojson dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.geotools:gt-opengis dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.geotools:gt-referencing dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 7494e6293188..a22cf83b9a57 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -160,7 +160,7 @@ 1.17 2.9 1.5.5.Final - 29.2 + 29.3 1.19.0 From 7533e8405e1840232b8ccd49871263260e4f114a Mon Sep 17 00:00:00 2001 From: Jan Bernitt Date: Tue, 31 Oct 2023 15:09:56 +0100 Subject: [PATCH 08/63] test: adds e2e test for continuous job execution [DHIS2-16004] (#15538) * test: adds e2e test for continuous job execution [DHIS2-16004] * fix: code formatting [DHIS2-16004] * fix: date parsing [DHIS2-16004] * fix: date parsing [DHIS2-16004] --- .../ContinuousMetadataImportTest.java | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/metadata/metadata_import/ContinuousMetadataImportTest.java diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/metadata/metadata_import/ContinuousMetadataImportTest.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/metadata/metadata_import/ContinuousMetadataImportTest.java new file mode 100644 index 000000000000..dcd6cf06b520 --- /dev/null +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/metadata/metadata_import/ContinuousMetadataImportTest.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2004-2023, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.metadata.metadata_import; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.google.gson.JsonObject; +import java.io.File; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import org.hisp.dhis.ApiTest; +import org.hisp.dhis.actions.LoginActions; +import org.hisp.dhis.actions.RestApiActions; +import org.hisp.dhis.actions.SystemActions; +import org.hisp.dhis.actions.metadata.MetadataActions; +import org.hisp.dhis.dto.ApiResponse; +import org.hisp.dhis.helpers.QueryParamsBuilder; +import org.hisp.dhis.helpers.file.FileReaderUtils; +import org.hisp.dhis.jsontree.JsonArray; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +/** + * Tests that the metadata import is running as a continuous import. + * + *

This means several small (fast) imports should run directly after another and not be executed + * with a gap of 20 seconds for the loop cycle time of the scheduler as each type otherwise can only + * run one job per cycle. + * + * @author Jan Bernitt + */ +class ContinuousMetadataImportTest extends ApiTest { + + private MetadataActions metadataActions; + private SystemActions systemActions; + private RestApiActions jobConfigurationActions; + + @BeforeAll + public void beforeAll() { + metadataActions = new MetadataActions(); + systemActions = new SystemActions(); + jobConfigurationActions = new RestApiActions("jobConfigurations"); + + new LoginActions().loginAsSuperUser(); + } + + @Test + void testRunContinuousImportJobs() throws Exception { + JsonObject object = + new FileReaderUtils() + .readJsonAndGenerateData(new File("src/test/resources/metadata/uniqueMetadata.json")); + // setup: import metadata so that we have references and can clean up + QueryParamsBuilder queryParamsBuilder = new QueryParamsBuilder(); + queryParamsBuilder.addAll( + "async=false", + "importReportMode=DEBUG", + "importStrategy=CREATE_AND_UPDATE", + "atomicMode=NONE"); + ApiResponse response = metadataActions.post(object, queryParamsBuilder); + + // send 5 async request to check later + queryParamsBuilder.add("async=true"); + List taskIds = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + response = metadataActions.post(object, queryParamsBuilder); + String taskId = response.extractString("response.id"); + assertNotNull(taskId, "Task id was not returned"); + taskIds.add(taskId); + } + + for (String taskId : taskIds) { + systemActions.waitUntilTaskCompleted("METADATA_IMPORT", taskId); + } + + DateTimeFormatter timestamp = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); + String urlTemplate = + "/gist?headless=true&fields=id,lastFinished,lastExecuted&order=lastExecuted:asc&filter=id:in:[%s]"; + JsonArray jobConfigs = + jobConfigurationActions + .get(urlTemplate.formatted(String.join(",", taskIds))) + .validateStatus(200) + .getBodyAsJsonValue(); + + LocalDateTime lastFinished = null; + for (org.hisp.dhis.jsontree.JsonObject jobConfig : + jobConfigs.asList(org.hisp.dhis.jsontree.JsonObject.class)) { + LocalDateTime lastExecuted = + LocalDateTime.parse(jobConfig.getString("lastExecuted").string(), timestamp); + if (lastFinished != null) { + long millisBetweenExecution = + lastExecuted.toInstant(ZoneOffset.UTC).toEpochMilli() + - lastFinished.toInstant(ZoneOffset.UTC).toEpochMilli(); + assertTrue( + millisBetweenExecution < 20_000, + "Time between execution should not be longer than 20 seconds (scheduler cycle time) by was: %d ms" + .formatted(millisBetweenExecution)); + } + lastFinished = LocalDateTime.parse(jobConfig.getString("lastFinished").string(), timestamp); + ; + } + } +} From 60ec85e73614d58fd7f12a29942b9d8ed93f3394 Mon Sep 17 00:00:00 2001 From: David Mackessy <131455290+david-mackessy@users.noreply.github.com> Date: Wed, 1 Nov 2023 02:41:07 +0000 Subject: [PATCH 09/63] fix: Async CSV Event import [DHIS2-12345] (#15547) * test diff * test diff * test diff * test diff * test diff * test diff * fix: Bind session to new thread to avoid Hibernate Lazy Init exceptions [DHIS2-12345] * remove duplicated test code * fix: Add e2e test to confirm fix [DHIS2-12345] * fix: Reinstate existing test with csv. Add new csv for this fix [DHIS2-12345] * fix format * fix: Update test data, add new DE to be used in test [DHIS2-12345] * fix: Update test data to include CODE in DE OS [DHIS2-12345] --- .../tracker/event/ImportEventsTask.java | 18 ++- .../org/hisp/dhis/actions/RestApiActions.java | 9 +- .../tracker/imports/events/EventsTests.java | 59 ++++++-- .../src/test/resources/setup/metadata.json | 34 ++++- .../resources/setup/tracker_metadata.json | 139 +++++++++++++++--- .../events/event-with-de-optionset.csv | 2 + .../deprecated/tracker/EventController.java | 6 +- 7 files changed, 231 insertions(+), 36 deletions(-) create mode 100644 dhis-2/dhis-test-e2e/src/test/resources/tracker/importer/events/event-with-de-optionset.csv diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/ImportEventsTask.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/ImportEventsTask.java index 5bb5983708d0..4286889ebff6 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/ImportEventsTask.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/ImportEventsTask.java @@ -28,6 +28,8 @@ package org.hisp.dhis.dxf2.deprecated.tracker.event; import java.util.List; +import org.hibernate.SessionFactory; +import org.hisp.dhis.dbms.DbmsUtils; import org.hisp.dhis.dxf2.common.ImportOptions; import org.hisp.dhis.scheduling.JobConfiguration; import org.hisp.dhis.security.SecurityContextRunnable; @@ -44,20 +46,34 @@ public class ImportEventsTask extends SecurityContextRunnable { private final JobConfiguration id; + private final SessionFactory sessionFactory; + public ImportEventsTask( List events, EventService eventService, ImportOptions importOptions, - JobConfiguration id) { + JobConfiguration id, + SessionFactory sessionFactory) { super(); this.events = events; this.eventService = eventService; this.importOptions = importOptions; this.id = id; + this.sessionFactory = sessionFactory; } @Override public void call() { eventService.processEventImport(events, importOptions, id); } + + @Override + public void before() { + DbmsUtils.bindSessionToThread(sessionFactory); + } + + @Override + public void after() { + DbmsUtils.unbindSessionFromThread(sessionFactory); + } } diff --git a/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/RestApiActions.java b/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/RestApiActions.java index df9eb334883f..8f908b8bf781 100644 --- a/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/RestApiActions.java +++ b/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/RestApiActions.java @@ -293,9 +293,16 @@ public ApiResponse postFile(File file) { } public ApiResponse postFile(File file, QueryParamsBuilder queryParamsBuilder) { + return this.postFile(file, queryParamsBuilder, null); + } + + public ApiResponse postFile( + File file, QueryParamsBuilder queryParamsBuilder, String contentType) { String url = queryParamsBuilder == null ? "" : queryParamsBuilder.build(); + String content = contentType != null ? contentType : "application/json"; - ApiResponse response = new ApiResponse(this.given().body(file).when().post(url)); + ApiResponse response = + new ApiResponse(this.given().body(file).contentType(content).when().post(url)); addCoverage("POST", url); diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/imports/events/EventsTests.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/imports/events/EventsTests.java index a38fa621ac6f..a28fd1a87279 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/imports/events/EventsTests.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/imports/events/EventsTests.java @@ -27,13 +27,14 @@ */ package org.hisp.dhis.tracker.imports.events; -import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hisp.dhis.helpers.matchers.MatchesJson.matchesJSON; +import static org.junit.jupiter.api.Assertions.assertEquals; import com.google.gson.JsonObject; import io.restassured.http.ContentType; @@ -43,9 +44,11 @@ import org.apache.commons.lang3.StringUtils; import org.hamcrest.Matchers; import org.hisp.dhis.Constants; +import org.hisp.dhis.actions.SystemActions; import org.hisp.dhis.actions.deprecated.tracker.EventActions; import org.hisp.dhis.actions.metadata.ProgramStageActions; import org.hisp.dhis.dto.ApiResponse; +import org.hisp.dhis.dto.ImportSummary; import org.hisp.dhis.dto.TrackerApiResponse; import org.hisp.dhis.helpers.JsonObjectBuilder; import org.hisp.dhis.helpers.QueryParamsBuilder; @@ -65,7 +68,7 @@ /** * @author Gintare Vilkelyte */ -public class EventsTests extends TrackerApiTest { +class EventsTests extends TrackerApiTest { private static final String OU_ID_0 = Constants.ORG_UNIT_IDS[0]; private static final String OU_ID = Constants.ORG_UNIT_IDS[1]; @@ -73,6 +76,7 @@ public class EventsTests extends TrackerApiTest { private static final String OU_ID_2 = Constants.ORG_UNIT_IDS[2]; private EventActions eventActions; + private SystemActions systemActions; private static Stream provideEventFilesTestArguments() { return Stream.of( @@ -84,10 +88,11 @@ private static Stream provideEventFilesTestArguments() { public void beforeAll() { loginActions.loginAsSuperUser(); eventActions = new EventActions(); + systemActions = new SystemActions(); } @Test - public void shouldImportEvents() throws Exception { + void shouldImportEvents() throws Exception { JsonObject eventBody = new FileReaderUtils() .readJsonAndGenerateData( @@ -116,7 +121,7 @@ public void shouldImportEvents() throws Exception { @ParameterizedTest @MethodSource("provideEventFilesTestArguments") - public void eventsImportNewEventsFromFile(String fileName, String contentType) throws Exception { + void eventsImportNewEventsFromFile(String fileName, String contentType) throws Exception { Object obj = new FileReaderUtils() .read(new File("src/test/resources/tracker/importer/events/" + fileName)) @@ -141,9 +146,45 @@ public void eventsImportNewEventsFromFile(String fileName, String contentType) t response.validate().statusCode(200).body("status", equalTo("OK")); } + /** + * This test name has the postfix 'EventsApi' (/events) to distinguish it from other tests in this + * class that call the '/tracker' API. There is a concept of 'old' & 'new' tracker APIs. This test + * tests the 'old' API + */ + @Test + void asyncImportEventsFromCsvFile_EventsApi() { + // given we want to import events asynchronously with csv format + + // when + // an async event import with csv file is posted + ApiResponse postAsyncResponse = + eventActions.postFile( + new File("src/test/resources/tracker/importer/events/event-with-de-optionset.csv"), + new QueryParamsBuilder() + .addAll( + "skipFirst=true", + "dryRun=false", + "async=true", + "eventIdScheme=UID", + "orgUnitIdScheme=UID", + "payloadFormat=csv"), + "text/csv"); + + postAsyncResponse.validate().statusCode(200); + String jobId = postAsyncResponse.extractString("response.id"); + + // then + // the task event completes + systemActions.waitUntilTaskCompleted("EVENT_IMPORT", jobId, 10); + + // and the task summary shows a successful import + List eventImport = systemActions.getTaskSummaries("EVENT_IMPORT", jobId); + assertEquals("SUCCESS", eventImport.get(0).getStatus()); + } + @ParameterizedTest @ValueSource(strings = {"true", "false"}) - public void shouldImportToRepeatableStage(Boolean repeatableStage) throws Exception { + void shouldImportToRepeatableStage(Boolean repeatableStage) throws Exception { // arrange String program = Constants.TRACKER_PROGRAM_ID; String programStage = @@ -183,7 +224,7 @@ public void shouldImportToRepeatableStage(Boolean repeatableStage) throws Except } @Test - public void shouldImportAndGetEventWithOrgUnitDifferentFromEnrollmentOrgUnit() throws Exception { + void shouldImportAndGetEventWithOrgUnitDifferentFromEnrollmentOrgUnit() throws Exception { String programId = Constants.TRACKER_PROGRAM_ID; String programStageId = "nlXNK4b7LVr"; @@ -235,7 +276,7 @@ public void shouldImportAndGetEventWithOrgUnitDifferentFromEnrollmentOrgUnit() t } @Test - public void shouldAddEventsToExistingTei() throws Exception { + void shouldAddEventsToExistingTei() throws Exception { String programId = Constants.TRACKER_PROGRAM_ID; String programStageId = "nlXNK4b7LVr"; @@ -258,7 +299,7 @@ public void shouldAddEventsToExistingTei() throws Exception { } @Test - public void shouldImportWithCategoryCombo() { + void shouldImportWithCategoryCombo() { ApiResponse program = programActions.get( "", diff --git a/dhis-2/dhis-test-e2e/src/test/resources/setup/metadata.json b/dhis-2/dhis-test-e2e/src/test/resources/setup/metadata.json index 49cefccacb79..f90761586dec 100644 --- a/dhis-2/dhis-test-e2e/src/test/resources/setup/metadata.json +++ b/dhis-2/dhis-test-e2e/src/test/resources/setup/metadata.json @@ -2922,7 +2922,7 @@ "code": "TA_YES_NO", "created": "2021-03-08T13:13:23.118", "lastUpdated": "2021-03-08T13:15:58.740", - "name": "TA Yes/No ", + "name": "TA Yes/No", "id": "ZGkmoWb77MW", "sharing": { "public": "rw------", @@ -3009,6 +3009,38 @@ "attributeValues": [], "legendSets": [], "aggregationLevels": [] + }, + { + "code": "TA_YES_NO_DE TEXT", + "lastUpdated": "2022-01-07T12:45:47.324", + "id": "vbZ5LGNfGyy", + "created": "2019-02-28T12:49:47.868", + "name": "TA Yes No", + "shortName": "TA Yes No", + "aggregationType": "NONE", + "domainType": "TRACKER", + "valueType": "TEXT", + "zeroIsSignificant": false, + "optionSet": { + "id": "ZGkmoWb77MW", + "code": "TA_YES_NO" + }, + "sharing": { + "owner": "M5zQapPyTZI", + "userGroups": { + "OPVIvvXzNTw": { + "access": "rw------", + "id": "OPVIvvXzNTw" + } + }, + "external": false, + "public": "rw------", + "users": {} + }, + "translations": [], + "attributeValues": [], + "legendSets": [], + "aggregationLevels": [] } ] } \ No newline at end of file diff --git a/dhis-2/dhis-test-e2e/src/test/resources/setup/tracker_metadata.json b/dhis-2/dhis-test-e2e/src/test/resources/setup/tracker_metadata.json index 92449f7e050f..610506d7199e 100644 --- a/dhis-2/dhis-test-e2e/src/test/resources/setup/tracker_metadata.json +++ b/dhis-2/dhis-test-e2e/src/test/resources/setup/tracker_metadata.json @@ -608,7 +608,7 @@ "sharing": { "public": "rw------", "external": false, - "userGroups":{ + "userGroups": { "OPVIvvXzNTw": { "id": "OPVIvvXzNTw", "access": "rwrw----" @@ -622,6 +622,54 @@ } ] }, + { + "lastUpdated": "2019-02-28T12:42:58.281", + "id": "Td2rkv8FsW9", + "created": "2019-02-28T11:41:32.093", + "name": "TA Event_program2", + "code": "TA EVENT_PROGRAM2", + "shortName": "TAEP2", + "completeEventsExpiryDays": 0, + "ignoreOverdueEvents": false, + "skipOffline": false, + "minAttributesRequiredToSearch": 1, + "displayFrontPageList": false, + "onlyEnrollOnce": false, + "programType": "WITHOUT_REGISTRATION", + "accessLevel": "OPEN", + "version": 4, + "maxTeiCountToReturn": 0, + "selectIncidentDatesInFuture": false, + "displayIncidentDate": true, + "selectEnrollmentDatesInFuture": false, + "expiryDays": 0, + "useFirstStageDuringRegistration": false, + "programTrackedEntityAttributes": [], + "notificationTemplates": [], + "translations": [], + "organisationUnits": [ + { + "id": "DiszpKrYNg8", + "code": "OU_559" + } + ], + "sharing": { + "public": "rw------", + "external": false, + "userGroups": { + "OPVIvvXzNTw": { + "id": "OPVIvvXzNTw", + "access": "rwrw----" + } + } + }, + "programStages": [ + { + "id": "PKLB23QZS49", + "code": "TA_EVENT_PROGRAM_STAGE2" + } + ] + }, { "lastUpdated": "2019-02-28T12:42:58.283", "id": "f1AyMswryyX", @@ -675,7 +723,7 @@ "sharing": { "public": "rwrw----", "external": false, - "userGroups":{ + "userGroups": { "OPVIvvXzNTw": { "id": "OPVIvvXzNTw", "access": "rwrw----" @@ -1256,7 +1304,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-01-07T12:50:38.506", @@ -1292,7 +1340,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] } ], "translations": [], @@ -1406,7 +1454,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-01-07T12:50:38.505", @@ -1442,7 +1490,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-01-07T12:50:38.505", @@ -1478,7 +1526,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-01-07T12:50:38.505", @@ -1514,7 +1562,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-01-07T12:50:38.505", @@ -1550,7 +1598,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-01-07T12:50:38.506", @@ -1586,7 +1634,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] } ], "translations": [], @@ -1668,7 +1716,52 @@ "sharing": { "public": "rw------", "external": false, - "userGroups":{ + "userGroups": { + "OPVIvvXzNTw": { + "id": "OPVIvvXzNTw", + "access": "rwrw----" + } + } + }, + "attributeValues": [], + "programStageSections": [] + }, + { + "lastUpdated": "2019-02-28T11:41:32.082", + "id": "PKLB23QZS49", + "created": "2019-02-28T11:41:32.082", + "name": "TA Event_program2", + "code": "TA_EVENT_PROGRAM_STAGE2", + "allowGenerateNextVisit": false, + "preGenerateUID": false, + "openAfterEnrollment": false, + "repeatable": false, + "remindCompleted": false, + "displayGenerateEventBox": true, + "generatedByEnrollmentDate": false, + "validationStrategy": "ON_COMPLETE", + "autoGenerateEvent": true, + "hideDueDate": false, + "blockEntryForm": false, + "minDaysFromStart": 0, + "program": { + "id": "Td2rkv8FsW9", + "code": "TA EVENT_PROGRAM2" + }, + "notificationTemplates": [], + "programStageDataElements": [ + { + "dataElement": { + "id": "vbZ5LGNfGyy", + "code": "TA_YES_NO_DE TEXT" + } + } + ], + "translations": [], + "sharing": { + "public": "rw------", + "external": false, + "userGroups": { "OPVIvvXzNTw": { "id": "OPVIvvXzNTw", "access": "rwrw----" @@ -1709,7 +1802,7 @@ "sharing": { "public": "rwrw----", "external": false, - "userGroups":{ + "userGroups": { "OPVIvvXzNTw": { "id": "OPVIvvXzNTw", "access": "rwrw----" @@ -2001,7 +2094,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-04-25T08:34:44.295", @@ -2035,7 +2128,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-04-25T08:34:44.295", @@ -2069,7 +2162,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-04-25T08:34:44.295", @@ -2103,7 +2196,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-04-25T08:34:44.296", @@ -2137,7 +2230,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-04-25T08:34:44.296", @@ -2171,7 +2264,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] } ], "translations": [] @@ -2226,7 +2319,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] }, { "lastUpdated": "2022-01-07T12:45:47.414", @@ -2250,7 +2343,7 @@ }, "favorites": [], "translations": [], - "attributeValues": [] + "attributeValues": [] } ], "attributeValues": [], @@ -3006,7 +3099,7 @@ "sharing": { "public": "rw------", "external": false, - "userGroups":{ + "userGroups": { "OPVIvvXzNTw": { "id": "OPVIvvXzNTw", "access": "rwrw----" @@ -3043,7 +3136,7 @@ "sharing": { "public": "rw------", "external": false, - "userGroups":{ + "userGroups": { "OPVIvvXzNTw": { "id": "OPVIvvXzNTw", "access": "rwrw----" @@ -3078,7 +3171,7 @@ "sharing": { "public": "rw------", "external": false, - "userGroups":{ + "userGroups": { "OPVIvvXzNTw": { "id": "OPVIvvXzNTw", "access": "rwrw----" diff --git a/dhis-2/dhis-test-e2e/src/test/resources/tracker/importer/events/event-with-de-optionset.csv b/dhis-2/dhis-test-e2e/src/test/resources/tracker/importer/events/event-with-de-optionset.csv new file mode 100644 index 000000000000..e1e67b468a0d --- /dev/null +++ b/dhis-2/dhis-test-e2e/src/test/resources/tracker/importer/events/event-with-de-optionset.csv @@ -0,0 +1,2 @@ +event,status,program,programStage,enrollment,orgUnit,eventDate,dueDate,latitude,longitude,dataElement,value,storedBy,providedElsewhere,completedDate,completedBy,geometry +Dfger123k4e,,Td2rkv8FsW9,PKLB23QZS49,,DiszpKrYNg8,2018-11-01T00:00:00.000,2058-11-01T00:00:00.000,,,vbZ5LGNfGyy,TA_YES,,true,,, diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EventController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EventController.java index 1545c87ef993..d6247fa01596 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EventController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EventController.java @@ -64,6 +64,7 @@ import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; import org.hisp.dhis.category.CategoryOptionCombo; import org.hisp.dhis.common.AssignedUserSelectionMode; import org.hisp.dhis.common.AsyncTaskExecutor; @@ -195,6 +196,8 @@ public class EventController { private final DhisConfigurationProvider dhisConfig; + private final SessionFactory sessionFactory; + private Schema schema; protected Schema getSchema() { @@ -1195,7 +1198,8 @@ private WebMessage startAsyncImport(ImportOptions importOptions, List eve JobConfiguration jobId = new JobConfiguration( "inMemoryEventImport", EVENT_IMPORT, currentUserService.getCurrentUser().getUid()); - taskExecutor.executeTask(new ImportEventsTask(events, eventService, importOptions, jobId)); + taskExecutor.executeTask( + new ImportEventsTask(events, eventService, importOptions, jobId, sessionFactory)); return jobConfigurationReport(jobId); } From 58be9f53ca5412921cee2597527dd52eb35946a9 Mon Sep 17 00:00:00 2001 From: Giuseppe Nespolino Date: Wed, 1 Nov 2023 16:31:27 +0100 Subject: [PATCH 10/63] feat: added support for 'createdBy', 'lastupdatedby' and 'storedby' [DHIS2-16059] (#15546) * feat: added support for 'createdBy', 'lastupdatedby' and 'storedby' [DHIS2-16059] * fix: e2e tests [DHIS2-16059] --- .../params/dimension/DimensionParam.java | 3 + .../tei/query/context/TeiStaticField.java | 4 +- .../analytics/tei/TrackedEntityQueryTest.java | 172 ++++++++++++++---- 3 files changed, 139 insertions(+), 40 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/params/dimension/DimensionParam.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/params/dimension/DimensionParam.java index cc1aec9c3fba..5386130114ed 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/params/dimension/DimensionParam.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/params/dimension/DimensionParam.java @@ -243,7 +243,10 @@ public enum StaticDimension implements TeiHeaderProvider { INCIDENTDATE(DATETIME, DimensionParamObjectType.PERIOD), EXECUTIONDATE(DATETIME, DimensionParamObjectType.PERIOD), LASTUPDATED(DATETIME, DimensionParamObjectType.PERIOD), + LASTUPDATEDBYDISPLAYNAME(TEXT, DimensionParamObjectType.STATIC), CREATED(DATETIME, DimensionParamObjectType.PERIOD), + CREATEDBYDISPLAYNAME(TEXT, DimensionParamObjectType.STATIC), + STOREDBY(TEXT, DimensionParamObjectType.STATIC), ENROLLMENT_STATUS(TEXT, DimensionParamObjectType.STATIC, null, "enrollmentstatus"), EVENT_STATUS(TEXT, DimensionParamObjectType.STATIC, null, "status"); diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/TeiStaticField.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/TeiStaticField.java index e55c5c963e90..d8062ca18927 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/TeiStaticField.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/TeiStaticField.java @@ -44,8 +44,10 @@ public enum TeiStaticField implements TeiHeaderProvider { TRACKED_ENTITY_INSTANCE("trackedentityinstanceuid", "Tracked entity instance", TEXT), LAST_UPDATED("lastupdated", "Last updated", DATETIME), - CREATED_BY_DISPLAY_NAME("createdbydisplayname", "Created by", TEXT), LAST_UPDATED_BY_DISPLAY_NAME("lastupdatedbydisplayname", "Last updated by", TEXT), + CREATED("created", "Created", DATETIME), + CREATED_BY_DISPLAY_NAME("createdbydisplayname", "Created by", TEXT), + STORED_BY("storedby", "Stored by", TEXT), GEOMETRY("geometry", "Geometry", TEXT), LONGITUDE("longitude", "Longitude", NUMBER), LATITUDE("latitude", "Latitude", NUMBER), diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/tei/TrackedEntityQueryTest.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/tei/TrackedEntityQueryTest.java index 32f3932eb00a..bbe2006ee24d 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/tei/TrackedEntityQueryTest.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/tei/TrackedEntityQueryTest.java @@ -52,8 +52,26 @@ public class TrackedEntityQueryTest extends AnalyticsApiTest { private AnalyticsTeiActions analyticsTeiActions = new AnalyticsTeiActions(); + private QueryParamsBuilder withDefaultHeaders(QueryParamsBuilder queryParamsBuilder) { + return queryParamsBuilder.add( + "headers=trackedentityinstanceuid," + + "lastupdated," + + "createdbydisplayname," + + "lastupdatedbydisplayname," + + "geometry," + + "longitude," + + "latitude," + + "ouname," + + "oucode," + + "ounamehierarchy," + + "IpHINAT79UW.w75KJ2mc4zz," + + "IpHINAT79UW.zDhUuAYrxNC," + + "IpHINAT79UW.cejWyOfXge6," + + "IpHINAT79UW.lZGmxYbs97q"); + } + @Test - public void queryWithProgramAndProgramStageWhenTotalPagesIsFalse() { + void queryWithProgramAndProgramStageWhenTotalPagesIsFalse() { // Given QueryParamsBuilder params = new QueryParamsBuilder() @@ -66,6 +84,8 @@ public void queryWithProgramAndProgramStageWhenTotalPagesIsFalse() { .add("page=1") .add("relativePeriodDate=2022-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -179,7 +199,7 @@ public void queryWithProgramAndProgramStageWhenTotalPagesIsFalse() { } @Test - public void queryWithProgramOnly() { + void queryWithProgramOnly() { // Given QueryParamsBuilder params = new QueryParamsBuilder() @@ -188,6 +208,8 @@ public void queryWithProgramOnly() { .add("asc=lastupdated") .add("relativePeriodDate=2022-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -358,7 +380,7 @@ public void queryWithProgramOnly() { } @Test - public void queryWithProgramAndPagination() { + void queryWithProgramAndPagination() { // Given QueryParamsBuilder params = new QueryParamsBuilder() @@ -369,6 +391,8 @@ public void queryWithProgramAndPagination() { .add("asc=lastupdated") .add("relativePeriodDate=2022-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -983,6 +1007,8 @@ public void queryWithProgramAndFilterByOrgUnit() { .add("desc=lastupdated") .add("relativePeriodDate=2022-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -1068,6 +1094,8 @@ public void queryWithProgramAndFilterByMultipleOrgUnits() { .add("desc=lastupdated") .add("relativePeriodDate=2022-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -1157,6 +1185,8 @@ public void queryWithProgramAndFilterByMultipleOrgUnitsSelected() { .add("desc=lastupdated") .add("relativePeriodDate=2022-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -1246,6 +1276,8 @@ public void queryWithProgramAndFilterByMultipleOrgUnitsChildren() { .add("desc=lastupdated") .add("relativePeriodDate=2022-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -1340,13 +1372,13 @@ public void queryWithProgramAndFilterByEnrollmentOrgUnit() { response .validate() .statusCode(200) - .body("headers", hasSize(equalTo(15))) + .body("headers", hasSize(equalTo(17))) .body("rows", hasSize(equalTo(14))) .body("metaData.dimensions.ou", hasSize(equalTo(1))) .body("metaData.dimensions.ou", hasItem("BV4IomHvri4")) .body("height", equalTo(14)) - .body("width", equalTo(15)) - .body("headerWidth", equalTo(15)); + .body("width", equalTo(17)) + .body("headerWidth", equalTo(17)); // Validate the first three rows, as samples. validateRow( @@ -1356,6 +1388,8 @@ public void queryWithProgramAndFilterByEnrollmentOrgUnit() { "NYKMYcUHzSt", "2015-08-07 15:47:24.377", "", + "2015-08-07 15:47:24.376", + "", "", "", "", @@ -1376,6 +1410,8 @@ public void queryWithProgramAndFilterByEnrollmentOrgUnit() { "sM7XmpfgKFb", "2015-08-07 15:47:24.033", "", + "2015-08-07 15:47:24.032", + "", "", "", "", @@ -1396,6 +1432,8 @@ public void queryWithProgramAndFilterByEnrollmentOrgUnit() { "vFSQneulDLz", "2015-08-07 15:47:22.383", "", + "2015-08-07 15:47:22.383", + "", "", "", "", @@ -1428,13 +1466,13 @@ public void queryWithProgramAndFilterByEventOrgUnit() { response .validate() .statusCode(200) - .body("headers", hasSize(equalTo(15))) + .body("headers", hasSize(equalTo(17))) .body("rows", hasSize(equalTo(14))) .body("metaData.dimensions.ou", hasSize(equalTo(1))) .body("metaData.dimensions.ou", hasItem("BV4IomHvri4")) .body("height", equalTo(14)) - .body("width", equalTo(15)) - .body("headerWidth", equalTo(15)); + .body("width", equalTo(17)) + .body("headerWidth", equalTo(17)); // Validate the first three rows, as samples. validateRow( @@ -1444,6 +1482,8 @@ public void queryWithProgramAndFilterByEventOrgUnit() { "NYKMYcUHzSt", "2015-08-07 15:47:24.377", "", + "2015-08-07 15:47:24.376", + "", "", "", "", @@ -1464,6 +1504,8 @@ public void queryWithProgramAndFilterByEventOrgUnit() { "sM7XmpfgKFb", "2015-08-07 15:47:24.033", "", + "2015-08-07 15:47:24.032", + "", "", "", "", @@ -1484,6 +1526,8 @@ public void queryWithProgramAndFilterByEventOrgUnit() { "vFSQneulDLz", "2015-08-07 15:47:22.383", "", + "2015-08-07 15:47:22.383", + "", "", "", "", @@ -1508,6 +1552,8 @@ public void queryWithProgramAndFilterByEventDate() { .add("desc=lastupdated,oucode") .add("relativePeriodDate=2022-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -1597,6 +1643,8 @@ public void queryWithProgramAndFilterByEnrollmentDate() { .add("desc=lastupdated") .add("relativePeriodDate=2023-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -1694,6 +1742,8 @@ public void queryWithProgramAndFilterLastUpdatedDate() { .add("desc=lastupdated") .add("relativePeriodDate=2022-09-27"); + params = withDefaultHeaders(params); + // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -1799,7 +1849,7 @@ public void queryWithProgramAndFilterByEventDataValue() { response .validate() .statusCode(200) - .body("headers", hasSize(equalTo(15))) + .body("headers", hasSize(equalTo(17))) .body("rows", hasSize(equalTo(1))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) @@ -1810,8 +1860,8 @@ public void queryWithProgramAndFilterByEventDataValue() { .body("metaData.dimensions", hasKey("pe")) .body("metaData.items.GQY2lXrypjO.name", equalTo("MCH Infant Weight (g)")) .body("height", equalTo(1)) - .body("width", equalTo(15)) - .body("headerWidth", equalTo(15)); + .body("width", equalTo(17)) + .body("headerWidth", equalTo(17)); validateRow( response, @@ -1820,6 +1870,8 @@ public void queryWithProgramAndFilterByEventDataValue() { "SBjuNw0Xtkn", "2014-10-01 12:27:37.837", "", + "2014-10-01 12:27:35.417", + "", "", "", "", @@ -1983,9 +2035,9 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeCode() { .statusCode(200) .body("rows", hasSize(equalTo(50))) .body("height", equalTo(50)) - .body("width", equalTo(15)) - .body("headerWidth", equalTo(15)) - .body("headers", hasSize(equalTo(15))) + .body("width", equalTo(17)) + .body("headerWidth", equalTo(17)) + .body("headers", hasSize(equalTo(17))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) .body("metaData.pager.isLastPage", is(false)) @@ -2003,6 +2055,8 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeCode() { "acCGrc3qlji", "2015-08-06 21:12:36.226", "", + "2015-08-06 21:12:36.226", + "", "", "", "", @@ -2023,6 +2077,8 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeCode() { "yG1PQX6xCkK", "2015-08-07 15:47:23.061", "", + "2015-08-07 15:47:23.06", + "", "", "", "", @@ -2043,6 +2099,8 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeCode() { "cr0DjId1xhO", "2015-08-06 21:20:47.468", "", + "2015-08-06 21:20:47.467", + "", "", "", "", @@ -2077,9 +2135,9 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeName() { .statusCode(200) .body("rows", hasSize(equalTo(50))) .body("height", equalTo(50)) - .body("width", equalTo(15)) - .body("headerWidth", equalTo(15)) - .body("headers", hasSize(equalTo(15))) + .body("width", equalTo(17)) + .body("headerWidth", equalTo(17)) + .body("headers", hasSize(equalTo(17))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) .body("metaData.pager.isLastPage", is(false)) @@ -2097,6 +2155,8 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeName() { "acCGrc3qlji", "2015-08-06 21:12:36.226", "", + "2015-08-06 21:12:36.226", + "", "", "", "", @@ -2117,6 +2177,8 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeName() { "yG1PQX6xCkK", "2015-08-07 15:47:23.061", "", + "2015-08-07 15:47:23.06", + "", "", "", "", @@ -2137,6 +2199,8 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeName() { "cr0DjId1xhO", "2015-08-06 21:20:47.468", "", + "2015-08-06 21:20:47.467", + "", "", "", "", @@ -2170,9 +2234,9 @@ public void queryWithCoordinatesOnly() { .statusCode(200) .body("rows", hasSize(equalTo(15))) .body("height", equalTo(15)) - .body("width", equalTo(21)) - .body("headerWidth", equalTo(21)) - .body("headers", hasSize(equalTo(21))) + .body("width", equalTo(23)) + .body("headerWidth", equalTo(23)) + .body("headers", hasSize(equalTo(23))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) .body("metaData.pager.isLastPage", is(true)) @@ -2190,6 +2254,8 @@ public void queryWithCoordinatesOnly() { "F8yKM85NbxW", "2019-08-21 13:31:33.41", "", + "2019-08-21 13:25:38.022", + "", "", "POINT(-11.7896 8.2593)", "-11.7896", @@ -2216,6 +2282,8 @@ public void queryWithCoordinatesOnly() { "DsSlC54GNXy", "2019-08-21 13:31:27.995", "", + "2019-08-21 13:25:29.756", + "", "", "POINT(-11.773 8.3201)", "-11.773", @@ -2242,6 +2310,8 @@ public void queryWithCoordinatesOnly() { "AuAWm61eD0X", "2019-08-21 13:31:09.399", "", + "2019-08-21 13:24:59.811", + "", "", "POINT(-11.7809 8.3373)", "-11.7809", @@ -2281,9 +2351,9 @@ public void queryWithGeometryOnly() { .statusCode(200) .body("rows", hasSize(equalTo(15))) .body("height", equalTo(15)) - .body("width", equalTo(21)) - .body("headerWidth", equalTo(21)) - .body("headers", hasSize(equalTo(21))) + .body("width", equalTo(23)) + .body("headerWidth", equalTo(23)) + .body("headers", hasSize(equalTo(23))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) .body("metaData.pager.isLastPage", is(true)) @@ -2301,6 +2371,8 @@ public void queryWithGeometryOnly() { "F8yKM85NbxW", "2019-08-21 13:31:33.41", "", + "2019-08-21 13:25:38.022", + "", "", "POINT(-11.7896 8.2593)", "-11.7896", @@ -2327,6 +2399,8 @@ public void queryWithGeometryOnly() { "DsSlC54GNXy", "2019-08-21 13:31:27.995", "", + "2019-08-21 13:25:29.756", + "", "", "POINT(-11.773 8.3201)", "-11.773", @@ -2353,6 +2427,8 @@ public void queryWithGeometryOnly() { "AuAWm61eD0X", "2019-08-21 13:31:09.399", "", + "2019-08-21 13:24:59.811", + "", "", "POINT(-11.7809 8.3373)", "-11.7809", @@ -2395,9 +2471,9 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeName() { .statusCode(200) .body("rows", hasSize(equalTo(50))) .body("height", equalTo(50)) - .body("width", equalTo(16)) - .body("headerWidth", equalTo(16)) - .body("headers", hasSize(equalTo(16))) + .body("width", equalTo(18)) + .body("headerWidth", equalTo(18)) + .body("headers", hasSize(equalTo(18))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) .body("metaData.pager.isLastPage", is(false)) @@ -2415,6 +2491,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeName() { "YiKaRIm5IUj", "2015-08-06 21:20:52.78", "", + "2015-08-06 21:20:52.78", + "", "", "", "", @@ -2436,6 +2514,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeName() { "ApUIfbrXE0G", "2015-08-06 21:20:52.777", "", + "2015-08-06 21:20:52.777", + "", "", "", "", @@ -2457,6 +2537,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeName() { "NiuDa8jIu4J", "2015-08-06 21:20:52.776", "", + "2015-08-06 21:20:52.776", + "", "", "", "", @@ -2494,9 +2576,9 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeUid() { .statusCode(200) .body("rows", hasSize(equalTo(50))) .body("height", equalTo(50)) - .body("width", equalTo(16)) - .body("headerWidth", equalTo(16)) - .body("headers", hasSize(equalTo(16))) + .body("width", equalTo(18)) + .body("headerWidth", equalTo(18)) + .body("headers", hasSize(equalTo(18))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) .body("metaData.pager.isLastPage", is(false)) @@ -2514,6 +2596,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeUid() { "YiKaRIm5IUj", "2015-08-06 21:20:52.78", "", + "2015-08-06 21:20:52.78", + "", "", "", "", @@ -2535,6 +2619,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeUid() { "ApUIfbrXE0G", "2015-08-06 21:20:52.777", "", + "2015-08-06 21:20:52.777", + "", "", "", "", @@ -2556,6 +2642,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeUid() { "NiuDa8jIu4J", "2015-08-06 21:20:52.776", "", + "2015-08-06 21:20:52.776", + "", "", "", "", @@ -2591,9 +2679,9 @@ public void queryWithProgramStatus() { .statusCode(200) .body("rows", hasSize(equalTo(3))) .body("height", equalTo(3)) - .body("width", equalTo(15)) - .body("headerWidth", equalTo(15)) - .body("headers", hasSize(equalTo(15))) + .body("width", equalTo(17)) + .body("headerWidth", equalTo(17)) + .body("headers", hasSize(equalTo(17))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) .body("metaData.pager.isLastPage", is(true)) @@ -2611,6 +2699,8 @@ public void queryWithProgramStatus() { "vOxUH373fy5", "2017-05-26 11:46:22.372", "", + "2017-01-20 10:44:02.77", + "", "", "", "", @@ -2645,9 +2735,9 @@ public void queryWithEnrollmentStatus() { .statusCode(200) .body("rows", hasSize(equalTo(3))) .body("height", equalTo(3)) - .body("width", equalTo(15)) - .body("headerWidth", equalTo(15)) - .body("headers", hasSize(equalTo(15))) + .body("width", equalTo(17)) + .body("headerWidth", equalTo(17)) + .body("headers", hasSize(equalTo(17))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) .body("metaData.pager.isLastPage", is(true)) @@ -2665,6 +2755,8 @@ public void queryWithEnrollmentStatus() { "vOxUH373fy5", "2017-05-26 11:46:22.372", "", + "2017-01-20 10:44:02.77", + "", "", "", "", @@ -2699,9 +2791,9 @@ public void queryWithEventStatus() { .statusCode(200) .body("rows", hasSize(equalTo(3))) .body("height", equalTo(3)) - .body("width", equalTo(15)) - .body("headerWidth", equalTo(15)) - .body("headers", hasSize(equalTo(15))) + .body("width", equalTo(17)) + .body("headerWidth", equalTo(17)) + .body("headers", hasSize(equalTo(17))) .body("metaData.pager.page", equalTo(1)) .body("metaData.pager.pageSize", equalTo(50)) .body("metaData.pager.isLastPage", is(true)) @@ -2719,6 +2811,8 @@ public void queryWithEventStatus() { "vOxUH373fy5", "2017-05-26 11:46:22.372", "", + "2017-01-20 10:44:02.77", + "", "", "", "", From 052af53d0030dee1bdc1ad2d5e096bc67e11f546 Mon Sep 17 00:00:00 2001 From: Maikel Arabori <51713408+maikelarabori@users.noreply.github.com> Date: Wed, 1 Nov 2023 17:22:06 +0100 Subject: [PATCH 11/63] test: Fix flaky assertions (#15562) --- .../controller/EventVisualizationControllerTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java index 2a005f6c65ee..2f37756ec32a 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java @@ -52,6 +52,7 @@ import org.hisp.dhis.webapi.DhisControllerConvenienceTest; import org.hisp.dhis.webapi.json.domain.JsonError; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -570,6 +571,7 @@ void testPost() { } @Test + @Disabled void testPostMultiPrograms() { // Given String body = @@ -659,7 +661,7 @@ void testPostMultiPrograms() { JsonObject response = GET("/eventVisualizations/" + uid - + "?fields=*,sorting,filters[:all,items[code, name, sharing, shortName, dimensionItemType, dimensionItem, displayShortName, displayName, displayFormName, id],repetitions],columns[:all,items[:all],repetitions]") + + "?fields=*,sorting,filters[dimension,programStage,repetition[:all],items[code,name,dimensionItemType,dimensionItem,id],repetitions],columns[dimension,program,programStage,items[id],repetitions]") .content(); assertThat(response.get("name").node().value(), is(equalTo("Test multi-programs post"))); @@ -729,14 +731,14 @@ void testPostMultiPrograms() { is( equalTo( """ -[{"translations":[],"favorites":[],"sharing":{"external":false,"users":{},"userGroups":{}},"dimensionType":"PROGRAM_INDICATOR","dataDimension":true,"items":[],"allItems":false,"program":{"id":"deabcdefghP"},"dimension":"deabcdefghB","access":{"manage":true,"externalize":true,"write":true,"read":true,"update":true,"delete":true},"favorite":false,"id":"deabcdefghB","attributeValues":[]},{"translations":[],"favorites":[],"sharing":{"external":false,"users":{},"userGroups":{}},"dimensionType":"PROGRAM_DATA_ELEMENT","dataDimension":true,"items":[],"allItems":false,"filter":"IN:Female","dimension":"deabcdefghC","valueType":"INTEGER","access":{"manage":true,"externalize":true,"write":true,"read":true,"update":true,"delete":true},"favorite":false,"id":"deabcdefghC","attributeValues":[]},{"translations":[],"favorites":[],"sharing":{"external":false,"users":{},"userGroups":{}},"dimensionType":"PERIOD","dataDimension":true,"items":[{"code":"2023-07-21_2023-08-01","name":"2023-07-21_2023-08-01","translations":[],"favorites":[],"sharing":{"external":false,"users":{},"userGroups":{}},"legendSets":[],"dimensionItem":"2023-07-21_2023-08-01","access":{"manage":true,"externalize":true,"write":true,"read":true,"update":true,"delete":true},"displayName":"2023-07-21_2023-08-01","favorite":false,"displayFormName":"2023-07-21_2023-08-01","id":"2023-07-21_2023-08-01","attributeValues":[]},{"code":"2023-01-21_2023-02-01","name":"2023-01-21_2023-02-01","translations":[],"favorites":[],"sharing":{"external":false,"users":{},"userGroups":{}},"legendSets":[],"dimensionItem":"2023-01-21_2023-02-01","access":{"manage":true,"externalize":true,"write":true,"read":true,"update":true,"delete":true},"displayName":"2023-01-21_2023-02-01","favorite":false,"displayFormName":"2023-01-21_2023-02-01","id":"2023-01-21_2023-02-01","attributeValues":[]}],"allItems":false,"program":{"id":"deabcdefghP"},"dimension":"eventDate","access":{"manage":true,"externalize":true,"write":true,"read":true,"update":true,"delete":true},"favorite":false,"id":"eventDate","attributeValues":[]}]"""))); +[{"items":[],"program":{"id":"deabcdefghP"},"dimension":"deabcdefghB"},{"items":[],"dimension":"deabcdefghC"},{"items":[{"id":"2023-07-21_2023-08-01"},{"id":"2023-01-21_2023-02-01"}],"program":{"id":"deabcdefghP"},"dimension":"eventDate"}]"""))); assertThat( response.get("filters").node().value().toString(), is( equalTo( """ -[{"translations":[],"favorites":[],"sharing":{"external":false,"users":{},"userGroups":{}},"dimensionType":"ORGANISATION_UNIT","dataDimension":true,"items":[{"code":"OrganisationUnitCodeA","name":"OrganisationUnitA","sharing":{"external":false,"users":{},"userGroups":{}},"shortName":"OrganisationUnitShortA","dimensionItemType":"ORGANISATION_UNIT","dimensionItem":"ImspTQPwCqd","displayShortName":"OrganisationUnitShortA","displayName":"OrganisationUnitA","displayFormName":"OrganisationUnitA","id":"ImspTQPwCqd"}],"allItems":false,"programStage":{"id":"deabcdefghS"},"program":{"id":"deabcdefghP"},"dimension":"ou","access":{"manage":true,"externalize":true,"write":true,"read":true,"update":true,"delete":true},"favorite":false,"id":"ou","attributeValues":[],"repetition":{"parent":"FILTER","dimension":"ou","program":"deabcdefghP","programStage":"deabcdefghS","indexes":[1,2,3,-2,-1,0]}},{"translations":[],"favorites":[],"sharing":{"external":false,"users":{},"userGroups":{}},"dimensionType":"PROGRAM_DATA_ELEMENT","dataDimension":true,"items":[],"allItems":false,"dimension":"deabcdefghE","valueType":"INTEGER","access":{"manage":true,"externalize":true,"write":true,"read":true,"update":true,"delete":true},"favorite":false,"id":"deabcdefghE","attributeValues":[],"repetition":{"parent":"FILTER","dimension":"deabcdefghE","indexes":[1,2,0]}}]"""))); +[{"items":[{"code":"OrganisationUnitCodeA","name":"OrganisationUnitA","dimensionItemType":"ORGANISATION_UNIT","dimensionItem":"ImspTQPwCqd","id":"ImspTQPwCqd"}],"programStage":{"id":"deabcdefghS"},"dimension":"ou","repetition":{"parent":"FILTER","dimension":"ou","program":"deabcdefghP","programStage":"deabcdefghS","indexes":[1,2,3,-2,-1,0]}},{"items":[],"dimension":"deabcdefghE","repetition":{"parent":"FILTER","dimension":"deabcdefghE","indexes":[1,2,0]}}]"""))); } @Test From 38588265eb42d443f90529abb5b66aff4b1e2dfd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Nov 2023 07:40:03 +0000 Subject: [PATCH 12/63] chore(deps-dev): bump org.seleniumhq.selenium:selenium-java (#15565) Bumps [org.seleniumhq.selenium:selenium-java](https://github.com/SeleniumHQ/selenium) from 4.14.1 to 4.15.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Commits](https://github.com/SeleniumHQ/selenium/commits/selenium-4.15.0) --- updated-dependencies: - dependency-name: org.seleniumhq.selenium:selenium-java dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/dhis-test-e2e/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/dhis-test-e2e/pom.xml b/dhis-2/dhis-test-e2e/pom.xml index d9b2fdc7139e..46b0b4d6b284 100644 --- a/dhis-2/dhis-test-e2e/pom.xml +++ b/dhis-2/dhis-test-e2e/pom.xml @@ -31,7 +31,7 @@ 4.2.0 1.18.30 2.24.0 - 4.14.1 + 4.15.0 2.0.9 4.5.14 5.2.1 From a2ac7dc1b59ebe00f195f93317f5f7d367cb5a16 Mon Sep 17 00:00:00 2001 From: radnov Date: Thu, 2 Nov 2023 09:49:54 +0200 Subject: [PATCH 13/63] ci: add check for deploy label [skip ci] (#15513) * ci: add check for deploy label [skip ci] * ci: trigger the destroy workflow when deploy label is removed * ci: wait-on-check action fork with a fix for checking multiple runs Using the HEAD branch ref when checking for the api-tests workflow can lead to checking the status of multiple runs and failing, because we only want successfull ones. * ci: use status endpoint to ensure instance is running * ci: delete instance URL comment when destroying * ci: use extra job for checking if label was removed --- .github/workflows/deploy-instance.yml | 27 +++++++++++++++++------- .github/workflows/destroy-instance.yml | 29 +++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/.github/workflows/deploy-instance.yml b/.github/workflows/deploy-instance.yml index cbb49a3b2e82..905f6a8f96b4 100644 --- a/.github/workflows/deploy-instance.yml +++ b/.github/workflows/deploy-instance.yml @@ -14,15 +14,27 @@ jobs: if: contains(github.event.pull_request.labels.*.name, 'deploy') runs-on: ubuntu-latest env: + HTTP: https --check-status + USER_EMAIL: ${{ secrets.IM_BOT_EMAIL }} + PASSWORD: ${{ secrets.IM_BOT_PASSWORD }} + IM_HOST: 'https://api.im.dhis2.org' INSTANCE_HOST: 'https://dev.im.dhis2.org' INSTANCE_NAME: pr-${{ github.event.pull_request.number }} steps: + - name: Dump context + uses: crazy-max/ghaction-dump-context@v2 + - name: Wait for API tests - uses: lewagon/wait-on-check-action@v1.3.1 + # Using this fork of the upstream https://github.com/lewagon/wait-on-check-action, + # as it will filter out and check only the latest run of a workflow when checking for the allowed conclusions, + # instead of checking all of the re-runs and possibly failing due to skipped or cancelled runs. + # See https://github.com/lewagon/wait-on-check-action/issues/85 for more info. + uses: t3chguy/wait-on-check-action@master with: ref: ${{ github.head_ref }} check-name: 'api-test' repo-token: ${{ secrets.GITHUB_TOKEN }} + allowed-conclusions: success - uses: actions/checkout@v4 with: @@ -35,20 +47,19 @@ jobs: - name: Deploy DHIS2 instance working-directory: scripts/instances env: - HTTP: https --check-status - USER_EMAIL: ${{ secrets.IM_BOT_EMAIL }} - PASSWORD: ${{ secrets.IM_BOT_PASSWORD }} - IM_HOST: 'https://api.im.dhis2.org' IMAGE_REPOSITORY: core-pr IMAGE_TAG: ${{ github.event.pull_request.number }} IMAGE_PULL_POLICY: Always - DATABASE_ID: sl-sierra-leone-dev-sql-gz + DATABASE_ID: test-dbs-sierra-leone-dev-sql-gz run: ./findByName.sh dev $INSTANCE_NAME && ./restart.sh dev $INSTANCE_NAME || ./deploy-dhis2.sh dev $INSTANCE_NAME - name: Wait for instance - run: timeout 300 bash -c 'while [[ "$(curl -fsSL -o /dev/null -w %{http_code} $INSTANCE_HOST/$INSTANCE_NAME)" != "200" ]]; do sleep 5; done' + working-directory: scripts/instances + env: + EXPECTED_STATUS: Running + run: timeout 600 bash -ex -c 'until [[ "$(./status.sh dev $INSTANCE_NAME | jq -r)" == "$EXPECTED_STATUS" ]]; do echo "Instance is not $EXPECTED_STATUS yet ..."; sleep 5; done' - - name: Generate analytics + - name: Start analytics generation run: curl -X POST -u "${{ secrets.DHIS2_USERNAME }}:${{ secrets.DHIS2_PASSWORD }}" "$INSTANCE_HOST/$INSTANCE_NAME/api/resourceTables/analytics" -d 'executeTei=true' - name: Comment instance URL diff --git a/.github/workflows/destroy-instance.yml b/.github/workflows/destroy-instance.yml index 756923da224d..b090a438f745 100644 --- a/.github/workflows/destroy-instance.yml +++ b/.github/workflows/destroy-instance.yml @@ -2,7 +2,7 @@ name: Destroy instance on: pull_request: - types: [closed] + types: [closed, unlabeled] # Cancel previous runs of the same workflow and PR number or branch/tag concurrency: @@ -10,7 +10,28 @@ concurrency: cancel-in-progress: true jobs: + check-deploy-label: + runs-on: ubuntu-latest + outputs: + removed: ${{ steps.check.outputs.removed }} + steps: + - name: Check if "deploy" was removed + id: check + env: + GH_TOKEN: ${{ github.token }} + run: | + last_removed_label=$( + gh api "repos/$GITHUB_REPOSITORY/issues/${{ github.event.pull_request.number }}/events" \ + --jq 'map(select(.event == "unlabeled"))[-1].label.name' + ) + + if [[ "$last_removed_label" == 'deploy' ]]; then + echo "removed=true" >> "$GITHUB_OUTPUT" + fi + destroy-instance: + needs: check-deploy-label + if: (github.event.action == 'closed' && contains(github.event.pull_request.labels.*.name, 'deploy')) || needs.check-deploy-label.outputs.removed runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -30,3 +51,9 @@ jobs: IM_HOST: 'https://api.im.dhis2.org' INSTANCE_NAME: pr-${{ github.event.number }} run: ./findByName.sh dev $INSTANCE_NAME && ./destroy.sh dev $INSTANCE_NAME + + - name: Delete instance URL comment + uses: actions-cool/maintain-one-comment@v3 + with: + body: "Instance deployed to https://dev.im.dhis2.org/pr-${{ github.event.pull_request.number }}" + delete: true From d72d3d47dbedb9c4d7eb8c20f4cbdc8ffa66b52f Mon Sep 17 00:00:00 2001 From: netroms Date: Thu, 2 Nov 2023 16:54:07 +0800 Subject: [PATCH 14/63] fix: identify persistent classes with an INT id field in the cache invalidation system (#15554) Co-authored-by: Morten Hansen --- .../redis/CacheInvalidationListener.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/dhis-2/dhis-support/dhis-support-cache-invalidation/src/main/java/org/hisp/dhis/cacheinvalidation/redis/CacheInvalidationListener.java b/dhis-2/dhis-support/dhis-support-cache-invalidation/src/main/java/org/hisp/dhis/cacheinvalidation/redis/CacheInvalidationListener.java index 2092771c4cb6..25d99c98ce2c 100644 --- a/dhis-2/dhis-support/dhis-support-cache-invalidation/src/main/java/org/hisp/dhis/cacheinvalidation/redis/CacheInvalidationListener.java +++ b/dhis-2/dhis-support/dhis-support-cache-invalidation/src/main/java/org/hisp/dhis/cacheinvalidation/redis/CacheInvalidationListener.java @@ -29,6 +29,7 @@ import io.lettuce.core.pubsub.RedisPubSubListener; import java.io.Serializable; +import java.lang.reflect.Field; import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.hibernate.SessionFactory; @@ -40,7 +41,6 @@ import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataset.CompleteDataSetRegistration; import org.hisp.dhis.dataset.DataSet; -import org.hisp.dhis.datastatistics.DataStatisticsEvent; import org.hisp.dhis.datavalue.DataValue; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.period.Period; @@ -158,9 +158,18 @@ private Serializable getEntityId(String message) throws ClassNotFoundException { return getTrackedEntityAttributeValueId(idPart); } else if (CompleteDataSetRegistration.class.isAssignableFrom(entityClass)) { return getCompleteDataSetRegistrationId(idPart); - } else if (DataStatisticsEvent.class.isAssignableFrom(entityClass)) { - return Integer.parseInt(idPart); } else { + try { + // Best effort to try to identify classes with int IDs. + Field idField = entityClass.getDeclaredField("id"); + Class idType = idField.getType(); + if (idType == int.class) { + return Integer.parseInt(idPart); + } + } catch (NoSuchFieldException e) { + // Ignore this exception, as it's expected unless it's a class with an int ID. + } + // In most cases the ID will be a long. return Long.parseLong(idPart); } } From 2e8820766c3d47197699c2f3dc302d430bf38bd2 Mon Sep 17 00:00:00 2001 From: Maikel Arabori <51713408+maikelarabori@users.noreply.github.com> Date: Thu, 2 Nov 2023 13:11:27 +0100 Subject: [PATCH 15/63] test: Fix test assertions in Event Vis. (#15573) --- .../EventVisualizationControllerTest.java | 153 +++++++++++++----- 1 file changed, 113 insertions(+), 40 deletions(-) diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java index 2f37756ec32a..525a039d7ef5 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java @@ -39,10 +39,12 @@ import static org.hisp.dhis.web.HttpStatus.OK; import static org.hisp.dhis.web.WebClientUtils.assertStatus; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.jsontree.JsonNode; import org.hisp.dhis.jsontree.JsonObject; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.Program; @@ -52,7 +54,6 @@ import org.hisp.dhis.webapi.DhisControllerConvenienceTest; import org.hisp.dhis.webapi.json.domain.JsonError; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -571,7 +572,6 @@ void testPost() { } @Test - @Disabled void testPostMultiPrograms() { // Given String body = @@ -585,16 +585,13 @@ void testPostMultiPrograms() { "direction": "ASC" }, { - "dimension": "deabcdefghP.deabcdefghS.deabcdefghB", + "dimension": "deabcdefghP.deabcdefghB", "direction": "DESC" } ], "columns": [ { "dimension": "deabcdefghB", - "programStage": { - "id": "deabcdefghS" - }, "program": { "id": "deabcdefghP" } @@ -673,41 +670,54 @@ void testPostMultiPrograms() { is(equalTo(""" {"id":"nEenWmSyUEp"}"""))); + JsonNode simpleDimensionNode0 = response.get("simpleDimensions").node().element(0); + assertThat(simpleDimensionNode0.get("parent").value().toString(), is(equalTo("COLUMN"))); + assertThat(simpleDimensionNode0.get("dimension").value().toString(), is(equalTo("eventDate"))); + assertThat(simpleDimensionNode0.get("program").value().toString(), is(equalTo("deabcdefghP"))); + assertThat( + simpleDimensionNode0.get("values").value().toString(), + is(equalTo(""" +["2023-07-21_2023-08-01","2023-01-21_2023-02-01"]"""))); + assertThat(simpleDimensionNode0.get("parent").value().toString(), is(equalTo("COLUMN"))); + + JsonNode sortingNode0 = response.get("sorting").node().element(0); assertThat( - response.get("simpleDimensions").node().value().toString(), - is( - equalTo( - """ -[{"parent":"COLUMN","dimension":"eventDate","program":"deabcdefghP","values":["2023-07-21_2023-08-01","2023-01-21_2023-02-01"]}]"""))); + sortingNode0.get("dimension").value().toString(), + is(equalTo("deabcdefghP[-1].deabcdefghS[0].deabcdefghB"))); + assertThat(sortingNode0.get("direction").value().toString(), is(equalTo("ASC"))); + JsonNode sortingNode1 = response.get("sorting").node().element(1); assertThat( - response.get("sorting").node().value().toString(), - is( - equalTo( - """ -[{"dimension":"deabcdefghP[-1].deabcdefghS[0].deabcdefghB","direction":"ASC"},{"dimension":"deabcdefghP.deabcdefghS.deabcdefghB","direction":"DESC"}]"""))); + sortingNode1.get("dimension").value().toString(), is(equalTo("deabcdefghP.deabcdefghB"))); + assertThat(sortingNode1.get("direction").value().toString(), is(equalTo("DESC"))); assertThat(response.get("rows").node().value().toString(), is(equalTo("[]"))); assertThat(response.get("rowDimensions").node().value().toString(), is(equalTo("[]"))); assertThat( response.get("columnDimensions").node().value().toString(), - is( - equalTo( - """ -["deabcdefghP.deabcdefghS.deabcdefghB","deabcdefghC","deabcdefghP.eventDate"]"""))); + is(equalTo(""" +["deabcdefghP.deabcdefghB","deabcdefghC","deabcdefghP.eventDate"]"""))); assertThat( response.get("filterDimensions").node().value().toString(), is(equalTo(""" ["deabcdefghP.deabcdefghS.ou","deabcdefghE"]"""))); + JsonNode dataElementDimensionsNode0 = response.get("dataElementDimensions").node().element(0); assertThat( - response.get("dataElementDimensions").node().value().toString(), - is( - equalTo( - """ -[{"dataElement":{"id":"deabcdefghC"},"filter":"IN:Female"},{"dataElement":{"id":"deabcdefghE"}}]"""))); + dataElementDimensionsNode0.get("dataElement").value().toString(), + is(equalTo(""" +{"id":"deabcdefghC"}"""))); + assertThat( + dataElementDimensionsNode0.get("filter").value().toString(), is(equalTo("IN:Female"))); + + JsonNode dataElementDimensionsNode1 = response.get("dataElementDimensions").node().element(1); + assertThat( + dataElementDimensionsNode1.get("dataElement").value().toString(), + is(equalTo(""" +{"id":"deabcdefghE"}"""))); + assertFalse(dataElementDimensionsNode1.isMember("filter")); assertThat( response.get("programIndicatorDimensions").node().value().toString(), @@ -719,26 +729,89 @@ void testPostMultiPrograms() { is(equalTo(""" [{"id":"ImspTQPwCqd"}]"""))); + JsonNode repetitionsNode0 = response.get("repetitions").node().element(0); + assertThat(repetitionsNode0.get("parent").value().toString(), is(equalTo("FILTER"))); + assertThat(repetitionsNode0.get("dimension").value().toString(), is(equalTo("ou"))); + assertThat(repetitionsNode0.get("program").value().toString(), is(equalTo("deabcdefghP"))); + assertThat(repetitionsNode0.get("programStage").value().toString(), is(equalTo("deabcdefghS"))); + assertThat(repetitionsNode0.get("indexes").value().toString(), is(equalTo("[1,2,3,-2,-1,0]"))); + + JsonNode repetitionsNode1 = response.get("repetitions").node().element(1); + assertThat(repetitionsNode1.get("parent").value().toString(), is(equalTo("FILTER"))); + assertThat(repetitionsNode1.get("dimension").value().toString(), is(equalTo("deabcdefghE"))); + assertFalse(repetitionsNode1.isMember("program")); + assertFalse(repetitionsNode1.isMember("programStage")); + assertThat(repetitionsNode1.get("indexes").value().toString(), is(equalTo("[1,2,0]"))); + + JsonNode columnsNode0 = response.get("columns").node().element(0); + assertThat(columnsNode0.get("items").value().toString(), is(equalTo("[]"))); + assertThat( + columnsNode0.get("program").value().toString(), is(equalTo(""" +{"id":"deabcdefghP"}"""))); + assertThat(columnsNode0.get("dimension").value().toString(), is(equalTo("deabcdefghB"))); + + JsonNode columnsNode1 = response.get("columns").node().element(1); + assertThat(columnsNode1.get("items").value().toString(), is(equalTo("[]"))); + assertFalse(columnsNode1.isMember("program")); + assertThat(columnsNode1.get("dimension").value().toString(), is(equalTo("deabcdefghC"))); + + JsonNode columnsNode2 = response.get("columns").node().element(2); assertThat( - response.get("repetitions").node().value().toString(), - is( - equalTo( - """ -[{"parent":"FILTER","dimension":"ou","program":"deabcdefghP","programStage":"deabcdefghS","indexes":[1,2,3,-2,-1,0]},{"parent":"FILTER","dimension":"deabcdefghE","indexes":[1,2,0]}]"""))); + columnsNode2.get("items").value().toString(), + is(equalTo(""" +[{"id":"2023-07-21_2023-08-01"},{"id":"2023-01-21_2023-02-01"}]"""))); + assertThat( + columnsNode2.get("program").value().toString(), is(equalTo(""" +{"id":"deabcdefghP"}"""))); + assertThat(columnsNode2.get("dimension").value().toString(), is(equalTo("eventDate"))); + JsonNode filtersNode0 = response.get("filters").node().element(0); + assertThat( + filtersNode0.get("items").element(0).get("code").value().toString(), + is(equalTo("OrganisationUnitCodeA"))); + assertThat( + filtersNode0.get("items").element(0).get("name").value().toString(), + is(equalTo("OrganisationUnitA"))); assertThat( - response.get("columns").node().value().toString(), - is( - equalTo( - """ -[{"items":[],"program":{"id":"deabcdefghP"},"dimension":"deabcdefghB"},{"items":[],"dimension":"deabcdefghC"},{"items":[{"id":"2023-07-21_2023-08-01"},{"id":"2023-01-21_2023-02-01"}],"program":{"id":"deabcdefghP"},"dimension":"eventDate"}]"""))); + filtersNode0.get("items").element(0).get("dimensionItemType").value().toString(), + is(equalTo("ORGANISATION_UNIT"))); + assertThat( + filtersNode0.get("items").element(0).get("dimensionItem").value().toString(), + is(equalTo("ImspTQPwCqd"))); + assertThat( + filtersNode0.get("items").element(0).get("id").value().toString(), + is(equalTo("ImspTQPwCqd"))); + assertThat( + filtersNode0.get("programStage").value().toString(), + is(equalTo(""" +{"id":"deabcdefghS"}"""))); + assertThat(filtersNode0.get("dimension").value().toString(), is(equalTo("ou"))); + assertThat( + filtersNode0.get("repetition").get("parent").value().toString(), is(equalTo("FILTER"))); + assertThat( + filtersNode0.get("repetition").get("dimension").value().toString(), is(equalTo("ou"))); + assertThat( + filtersNode0.get("repetition").get("program").value().toString(), + is(equalTo("deabcdefghP"))); + assertThat( + filtersNode0.get("repetition").get("programStage").value().toString(), + is(equalTo("deabcdefghS"))); + assertThat( + filtersNode0.get("repetition").get("indexes").value().toString(), + is(equalTo("[1,2,3,-2,-1,0]"))); + JsonNode filtersNode1 = response.get("filters").node().element(1); + assertThat(filtersNode1.get("items").value().toString(), is(equalTo("[]"))); + assertThat(filtersNode1.get("dimension").value().toString(), is(equalTo("deabcdefghE"))); + assertThat( + filtersNode1.get("repetition").get("parent").value().toString(), is(equalTo("FILTER"))); + assertThat( + filtersNode1.get("repetition").get("dimension").value().toString(), + is(equalTo("deabcdefghE"))); + assertFalse(filtersNode1.get("repetition").isMember("program")); + assertFalse(filtersNode1.get("repetition").isMember("programStage")); assertThat( - response.get("filters").node().value().toString(), - is( - equalTo( - """ -[{"items":[{"code":"OrganisationUnitCodeA","name":"OrganisationUnitA","dimensionItemType":"ORGANISATION_UNIT","dimensionItem":"ImspTQPwCqd","id":"ImspTQPwCqd"}],"programStage":{"id":"deabcdefghS"},"dimension":"ou","repetition":{"parent":"FILTER","dimension":"ou","program":"deabcdefghP","programStage":"deabcdefghS","indexes":[1,2,3,-2,-1,0]}},{"items":[],"dimension":"deabcdefghE","repetition":{"parent":"FILTER","dimension":"deabcdefghE","indexes":[1,2,0]}}]"""))); + filtersNode1.get("repetition").get("indexes").value().toString(), is(equalTo("[1,2,0]"))); } @Test From 25def13fb21c9d78a88b8904e14de4155a1ffb44 Mon Sep 17 00:00:00 2001 From: Enrico Colasante Date: Thu, 2 Nov 2023 13:14:36 +0100 Subject: [PATCH 16/63] chore: Rename executionDate to occurredDate in service layer [TECH-1615] (#15557) * chore: Rename executionDate to occurredDate in service layer [TECH-1615] * Fix tests * Fix tests --- .../java/org/hisp/dhis/program/Event.java | 12 ++++----- .../comparator/EventVisitDateComparator.java | 4 +-- ...ogramStageNotificationMessageRenderer.java | 3 +-- .../program/DefaultEnrollmentService.java | 2 +- .../dhis/program/DefaultEventService.java | 2 +- .../hibernate/HibernateEventStore.java | 2 +- .../dhis/sms/listener/CommandSMSListener.java | 2 +- .../sms/listener/CompressionSMSListener.java | 2 +- .../hisp/dhis/program/hibernate/Event.hbm.xml | 2 +- ...TrackerNotificationWebHookServiceTest.java | 2 +- .../tracker/event/AbstractEventService.java | 4 +-- .../tracker/event/JdbcEventStore.java | 9 ++----- .../context/ProgramStageInstanceSupplier.java | 2 +- .../mapper/ProgramStageInstanceMapper.java | 2 +- ...rogramStageInstanceUpdatePreProcessor.java | 2 +- .../validation/ExpirationDaysCheck.java | 4 +-- .../validation/ExpirationDaysCheckTest.java | 2 +- ...DefaultProgramRuleEntityMapperService.java | 4 +-- .../ProgramRuleEntityMapperServiceTest.java | 4 +-- .../export/event/DefaultEventService.java | 2 +- .../export/event/EventOperationParams.java | 4 +-- .../event/EventOperationParamsMapper.java | 4 +-- .../export/event/EventQueryParams.java | 20 +++++++------- .../tracker/export/event/JdbcEventStore.java | 13 +++++----- .../mapper/EventRowCallbackHandler.java | 2 +- .../EventTrackerConverterService.java | 8 +++--- .../imports/preheat/mappers/EventMapper.java | 2 +- .../EventTrackerConverterServiceTest.java | 2 +- .../org/hisp/dhis/DhisConvenienceTest.java | 2 +- .../event/data/EventAnalyticsServiceTest.java | 22 ++++++++-------- .../deprecated/tracker/EventImportTest.java | 4 +-- .../maintenance/MaintenanceServiceTest.java | 4 +-- ...rogramNotificationMessageRendererTest.java | 6 ++--- .../predictor/EventPredictionServiceTest.java | 4 +-- .../engine/ProgramRuleEngineTest.java | 10 +++---- .../TrackerAccessManagerTest.java | 2 +- .../OrderAndPaginationExporterTest.java | 10 +++---- .../export/event/EventExporterTest.java | 8 +++--- .../TrackedEntityServiceTest.java | 26 +++++++++---------- .../AnalyticsValidationServiceTest.java | 4 +-- .../TrackedEntitiesExportControllerTest.java | 2 +- .../tracker/export/event/EventMapper.java | 4 +-- .../event/EventRequestParamsMapper.java | 4 +-- .../relationship/RelationshipItemMapper.java | 2 +- .../event/EventRequestParamsMapperTest.java | 4 +-- 45 files changed, 118 insertions(+), 123 deletions(-) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Event.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Event.java index 9b836955b65e..57c3eeccddf8 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Event.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Event.java @@ -74,7 +74,7 @@ public class Event extends SoftDeletableObject { private Date dueDate; - private Date executionDate; + private Date occurredDate; @AuditAttribute private OrganisationUnit organisationUnit; @@ -226,12 +226,12 @@ public void setDueDate(Date dueDate) { @JsonProperty("eventDate") @JacksonXmlProperty(localName = "eventDate", namespace = DxfNamespaces.DXF_2_0) - public Date getExecutionDate() { - return executionDate; + public Date getOccurredDate() { + return occurredDate; } - public void setExecutionDate(Date executionDate) { - this.executionDate = executionDate; + public void setOccurredDate(Date occurredDate) { + this.occurredDate = occurredDate; } @JsonProperty @@ -362,7 +362,7 @@ public void setAssignedUser(User assignedUser) { public boolean isCreatableInSearchScope() { return this.getStatus() == EventStatus.SCHEDULE && this.getEventDataValues().isEmpty() - && this.getExecutionDate() == null; + && this.getOccurredDate() == null; } @Override diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/comparator/EventVisitDateComparator.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/comparator/EventVisitDateComparator.java index 4be2c76623a0..5d9ba5f5a8d8 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/comparator/EventVisitDateComparator.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/comparator/EventVisitDateComparator.java @@ -37,8 +37,8 @@ public class EventVisitDateComparator implements Comparator { @Override public int compare(Event event1, Event event2) { - Date d1 = (event1.getExecutionDate() != null) ? event1.getExecutionDate() : event1.getDueDate(); - Date d2 = (event2.getExecutionDate() != null) ? event2.getExecutionDate() : event2.getDueDate(); + Date d1 = (event1.getOccurredDate() != null) ? event1.getOccurredDate() : event1.getDueDate(); + Date d2 = (event2.getOccurredDate() != null) ? event2.getOccurredDate() : event2.getDueDate(); if (d1.before(d2)) { return -1; } else if (d1.after(d2)) { diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/notification/ProgramStageNotificationMessageRenderer.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/notification/ProgramStageNotificationMessageRenderer.java index bcf10f8c227c..552664b4c19e 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/notification/ProgramStageNotificationMessageRenderer.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/notification/ProgramStageNotificationMessageRenderer.java @@ -68,8 +68,7 @@ public class ProgramStageNotificationMessageRenderer event -> event.getOrganisationUnit().getCode()) .put(ProgramStageTemplateVariable.DUE_DATE, event -> formatDate(event.getDueDate())) .put( - ProgramStageTemplateVariable.EVENT_DATE, - event -> formatDate(event.getExecutionDate())) + ProgramStageTemplateVariable.EVENT_DATE, event -> formatDate(event.getOccurredDate())) .put( ProgramStageTemplateVariable.DAYS_SINCE_DUE_DATE, event -> daysSince(event.getDueDate())) diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java index 9aca2eb7d69c..1601a698bce6 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java @@ -467,7 +467,7 @@ public void cancelEnrollmentStatus(Enrollment enrollment) { // --------------------------------------------------------------------- for (Event event : enrollment.getEvents()) { - if (event.getExecutionDate() == null) { + if (event.getOccurredDate() == null) { // ------------------------------------------------------------- // Set status as skipped for overdue events, or delete // ------------------------------------------------------------- diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEventService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEventService.java index fa2632e916a3..c20cb0dc42a1 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEventService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEventService.java @@ -185,7 +185,7 @@ public Event createEvent( if (programStage.getOpenAfterEnrollment() || enrollment.getProgram().isWithoutRegistration() || programStage.getPeriodType() != null) { - event.setExecutionDate(dueDate); + event.setOccurredDate(dueDate); event.setStatus(EventStatus.ACTIVE); } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/hibernate/HibernateEventStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/hibernate/HibernateEventStore.java index 2da31289289a..13729673fe28 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/hibernate/HibernateEventStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/hibernate/HibernateEventStore.java @@ -210,7 +210,7 @@ public List getWithScheduledNotifications( + "inner join ev.programStage as ps " + "where :notificationTemplate in elements(ps.notificationTemplates) " + "and ev.dueDate is not null " - + "and ev.executionDate is null " + + "and ev.occurredDate is null " + "and ev.status != :skippedEventStatus " + "and cast(:targetDate as date) = ev.dueDate " + "and ev.deleted is false"; diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CommandSMSListener.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CommandSMSListener.java index 197740134589..7e82601e54e8 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CommandSMSListener.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CommandSMSListener.java @@ -248,7 +248,7 @@ protected void register( event.setOrganisationUnit(ous.iterator().next()); event.setProgramStage(smsCommand.getProgramStage()); event.setEnrollment(enrollment); - event.setExecutionDate(sms.getSentDate()); + event.setOccurredDate(sms.getSentDate()); event.setDueDate(sms.getSentDate()); event.setAttributeOptionCombo(dataElementCategoryService.getDefaultCategoryOptionCombo()); event.setCompletedBy("DHIS 2"); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CompressionSMSListener.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CompressionSMSListener.java index 5fc3c2e2e1b3..e6cc1a1978d7 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CompressionSMSListener.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CompressionSMSListener.java @@ -269,7 +269,7 @@ protected List saveNewEvent( event.setOrganisationUnit(orgUnit); event.setProgramStage(programStage); event.setEnrollment(enrollment); - event.setExecutionDate(eventDate); + event.setOccurredDate(eventDate); event.setDueDate(dueDate); event.setAttributeOptionCombo(aoc); event.setStoredBy(user.getUsername()); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml index 9fd4b09253c1..2945f926063a 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml +++ b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml @@ -46,7 +46,7 @@ - + diff --git a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/notification/TrackerNotificationWebHookServiceTest.java b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/notification/TrackerNotificationWebHookServiceTest.java index c916519a027c..1178c02c21a0 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/notification/TrackerNotificationWebHookServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/notification/TrackerNotificationWebHookServiceTest.java @@ -147,7 +147,7 @@ public void initTest() { event.setProgramStage(programStageA); event.setOrganisationUnit(organisationUnitA); enrollment.setEnrollmentDate(new Date()); - event.setExecutionDate(new Date()); + event.setOccurredDate(new Date()); event.setDueDate(new Date()); event.setEnrollment(enrollment); diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java index 050dd579cab0..9003dd1649c9 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java @@ -595,7 +595,7 @@ public org.hisp.dhis.dxf2.deprecated.tracker.event.Event getEvent( event.setEnrollmentStatus( EnrollmentStatus.fromProgramStatus(programStageInstance.getEnrollment().getStatus())); event.setStatus(programStageInstance.getStatus()); - event.setEventDate(DateUtils.getIso8601NoTz(programStageInstance.getExecutionDate())); + event.setEventDate(DateUtils.getIso8601NoTz(programStageInstance.getOccurredDate())); event.setDueDate(DateUtils.getIso8601NoTz(programStageInstance.getDueDate())); event.setStoredBy(programStageInstance.getStoredBy()); event.setCompletedBy(programStageInstance.getCompletedBy()); @@ -826,7 +826,7 @@ public void updateEventForEventDate(org.hisp.dhis.dxf2.deprecated.tracker.event. } programStageInstance.setOrganisationUnit(organisationUnit); - programStageInstance.setExecutionDate(executionDate); + programStageInstance.setOccurredDate(executionDate); eventService.updateEvent(programStageInstance); } diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java index 018e5face28e..4212002f3e70 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java @@ -29,11 +29,6 @@ import static java.util.stream.Collectors.toList; import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; -import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; -import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; -import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CHILDREN; -import static org.hisp.dhis.common.OrganisationUnitSelectionMode.DESCENDANTS; -import static org.hisp.dhis.common.OrganisationUnitSelectionMode.SELECTED; import static org.hisp.dhis.common.ValueType.NUMERIC_TYPES; import static org.hisp.dhis.dxf2.deprecated.tracker.event.AbstractEventService.STATIC_EVENT_COLUMNS; import static org.hisp.dhis.dxf2.deprecated.tracker.event.EventSearchParams.EVENT_ATTRIBUTE_OPTION_COMBO_ID; @@ -1947,7 +1942,7 @@ private void bindEventParamsForInsert(PreparedStatement ps, Event event) ps.setLong(1, event.getEnrollment().getId()); ps.setLong(2, event.getProgramStage().getId()); ps.setTimestamp(3, JdbcEventSupport.toTimestamp(event.getDueDate())); - ps.setTimestamp(4, JdbcEventSupport.toTimestamp(event.getExecutionDate())); + ps.setTimestamp(4, JdbcEventSupport.toTimestamp(event.getOccurredDate())); ps.setLong(5, event.getOrganisationUnit().getId()); ps.setString(6, event.getStatus().toString()); ps.setTimestamp(7, JdbcEventSupport.toTimestamp(event.getCompletedDate())); @@ -1982,7 +1977,7 @@ private MapSqlParameterSource getSqlParametersForUpdate(org.hisp.dhis.program.Ev JdbcEventSupport.toTimestamp(event.getDueDate())) .addValue( EventQuery.COLUMNS.EXECUTION_DATE.getColumnName(), - JdbcEventSupport.toTimestamp(event.getExecutionDate())) + JdbcEventSupport.toTimestamp(event.getOccurredDate())) .addValue("organisationunitid", event.getOrganisationUnit().getId()) .addValue(EventQuery.COLUMNS.STATUS.getColumnName(), event.getStatus().toString()) .addValue( diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java index 503040a1ba9f..f1594cf220fc 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java @@ -117,7 +117,7 @@ public Map get( psi.setProgramStage(getProgramStage(importOptions, rs.getLong("programstageid"))); psi.setOrganisationUnit(getOu(rs)); psi.setDueDate(rs.getTimestamp("duedate")); - psi.setExecutionDate(rs.getTimestamp("executiondate")); + psi.setOccurredDate(rs.getTimestamp("executiondate")); psi.setCompletedDate(rs.getTimestamp("completeddate")); psi.setAttributeOptionCombo(getCatOptionCombo(rs)); try { diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/mapper/ProgramStageInstanceMapper.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/mapper/ProgramStageInstanceMapper.java index ae00abc8034a..b626feb1dd3d 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/mapper/ProgramStageInstanceMapper.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/mapper/ProgramStageInstanceMapper.java @@ -232,7 +232,7 @@ private Optional getOrganisationUnit( private void setExecutionDate( org.hisp.dhis.dxf2.deprecated.tracker.event.Event event, Event psi) { if (event.getEventDate() != null) { - psi.setExecutionDate(parseDate(event.getEventDate())); + psi.setOccurredDate(parseDate(event.getEventDate())); } } diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/preprocess/ProgramStageInstanceUpdatePreProcessor.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/preprocess/ProgramStageInstanceUpdatePreProcessor.java index dbfd883fe985..a3f61a25cf1a 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/preprocess/ProgramStageInstanceUpdatePreProcessor.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/preprocess/ProgramStageInstanceUpdatePreProcessor.java @@ -58,7 +58,7 @@ public void process( if (programStageInstance != null) { if (event.getEventDate() != null) { - programStageInstance.setExecutionDate(parseDate(event.getEventDate())); + programStageInstance.setOccurredDate(parseDate(event.getEventDate())); } if (categoryOptionCombo != null) { diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/validation/ExpirationDaysCheck.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/validation/ExpirationDaysCheck.java index e03775b04d26..564df2db8060 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/validation/ExpirationDaysCheck.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/validation/ExpirationDaysCheck.java @@ -117,11 +117,11 @@ private ImportSummary checkEventOrPsiExpirationDate( if (programStageInstance != null) { Date today = new Date(); - if (programStageInstance.getExecutionDate() == null) { + if (programStageInstance.getOccurredDate() == null) { return error("Event needs to have event date", event.getEvent()); } - Period period = periodType.createPeriod(programStageInstance.getExecutionDate()); + Period period = periodType.createPeriod(programStageInstance.getOccurredDate()); if (!Period.isDateInTimeFrame( null, addDays(period.getEndDate(), program.getExpiryDays()), today)) { return error( diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/validation/ExpirationDaysCheckTest.java b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/validation/ExpirationDaysCheckTest.java index 71f3b7f5b1cb..619fd5a91a51 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/validation/ExpirationDaysCheckTest.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/update/validation/ExpirationDaysCheckTest.java @@ -180,7 +180,7 @@ void failWhenProgramStageInstanceHasExecutionDateBeforeAllowedProgramExpiryDaysB Map psiMap = new HashMap<>(); Event psi = new Event(); // month length + 5 - psi.setExecutionDate(getTodayMinusDays(35)); + psi.setOccurredDate(getTodayMinusDays(35)); // days psi.setUid(event.getUid()); psiMap.put(event.getUid(), psi); diff --git a/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java b/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java index c3c1b1b9c7cb..50e647b949e5 100644 --- a/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java +++ b/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java @@ -438,7 +438,7 @@ public RuleEvent toMappedRuleEvent(Event eventToEvaluate) { eventToEvaluate.getUid(), eventToEvaluate.getProgramStage().getUid(), RuleEvent.Status.valueOf(eventToEvaluate.getStatus().toString()), - ObjectUtils.defaultIfNull(eventToEvaluate.getExecutionDate(), eventToEvaluate.getDueDate()), + ObjectUtils.defaultIfNull(eventToEvaluate.getOccurredDate(), eventToEvaluate.getDueDate()), eventToEvaluate.getDueDate(), orgUnit, orgUnitCode, @@ -449,7 +449,7 @@ public RuleEvent toMappedRuleEvent(Event eventToEvaluate) { dv -> RuleDataValue.create( ObjectUtils.defaultIfNull( - eventToEvaluate.getExecutionDate(), eventToEvaluate.getDueDate()), + eventToEvaluate.getOccurredDate(), eventToEvaluate.getDueDate()), eventToEvaluate.getProgramStage().getUid(), dv.getDataElement(), dv.getValue())) diff --git a/dhis-2/dhis-services/dhis-service-program-rule/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEntityMapperServiceTest.java b/dhis-2/dhis-services/dhis-service-program-rule/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEntityMapperServiceTest.java index c41612c9bd02..b9f536adee0f 100644 --- a/dhis-2/dhis-services/dhis-service-program-rule/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEntityMapperServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-program-rule/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEntityMapperServiceTest.java @@ -475,13 +475,13 @@ private void setUpProgramRules() { eventA.setOrganisationUnit(organisationUnit); eventA.setAutoFields(); eventA.setDueDate(new Date()); - eventA.setExecutionDate(new Date()); + eventA.setOccurredDate(new Date()); eventA.setEventDataValues(Sets.newHashSet(eventDataValueA)); eventB.setOrganisationUnit(organisationUnit); eventB.setAutoFields(); eventB.setDueDate(new Date()); - eventB.setExecutionDate(new Date()); + eventB.setOccurredDate(new Date()); eventB.setEventDataValues(Sets.newHashSet(eventDataValueB)); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/DefaultEventService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/DefaultEventService.java index 47c145902387..36894ecdd66f 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/DefaultEventService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/DefaultEventService.java @@ -94,7 +94,7 @@ public Event getEvent(@Nonnull Event event, EventParams eventParams) throws Forb result.setUid(event.getUid()); result.setStatus(event.getStatus()); - result.setExecutionDate(event.getExecutionDate()); + result.setOccurredDate(event.getOccurredDate()); result.setDueDate(event.getDueDate()); result.setStoredBy(event.getStoredBy()); result.setCompletedBy(event.getCompletedBy()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParams.java index 6c41aaca55da..b2d7afa8549c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParams.java @@ -75,9 +75,9 @@ public class EventOperationParams { private String trackedEntityUid; - private Date startDate; + private Date occurredAfter; - private Date endDate; + private Date occurredBefore; private EventStatus eventStatus; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java index 1d6ca89fb428..26bbadebbfe8 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java @@ -127,8 +127,8 @@ public EventQueryParams map(EventOperationParams operationParams) .setAssignedUserQueryParam( new AssignedUserQueryParam( operationParams.getAssignedUserMode(), user, operationParams.getAssignedUsers())) - .setStartDate(operationParams.getStartDate()) - .setEndDate(operationParams.getEndDate()) + .setOccurredStartDate(operationParams.getOccurredAfter()) + .setOccurredEndDate(operationParams.getOccurredBefore()) .setScheduleAtStartDate(operationParams.getScheduledAfter()) .setScheduleAtEndDate(operationParams.getScheduledBefore()) .setUpdatedAtStartDate(operationParams.getUpdatedAfter()) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQueryParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQueryParams.java index 4225473f60ae..3cfc396499b0 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQueryParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQueryParams.java @@ -75,9 +75,9 @@ class EventQueryParams { private TrackedEntity trackedEntity; - private Date startDate; + private Date occurredStartDate; - private Date endDate; + private Date occurredEndDate; private EventStatus eventStatus; @@ -267,21 +267,21 @@ public EventQueryParams setTrackedEntity(TrackedEntity trackedEntity) { return this; } - public Date getStartDate() { - return startDate; + public Date getOccurredStartDate() { + return occurredStartDate; } - public EventQueryParams setStartDate(Date startDate) { - this.startDate = startDate; + public EventQueryParams setOccurredStartDate(Date occurredStartDate) { + this.occurredStartDate = occurredStartDate; return this; } - public Date getEndDate() { - return endDate; + public Date getOccurredEndDate() { + return occurredEndDate; } - public EventQueryParams setEndDate(Date endDate) { - this.endDate = endDate; + public EventQueryParams setOccurredEndDate(Date occurredEndDate) { + this.occurredEndDate = occurredEndDate; return this; } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java index 73da4357947c..30678a7b5f00 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java @@ -196,7 +196,7 @@ class JdbcEventStore implements EventStore { entry("enrollment.enrollmentDate", COLUMN_ENROLLMENT_DATE), entry("organisationUnit.uid", COLUMN_ORG_UNIT_UID), entry("enrollment.trackedEntity.uid", COLUMN_TRACKEDENTITY_UID), - entry("executionDate", COLUMN_EVENT_EXECUTION_DATE), + entry("occurredDate", COLUMN_EVENT_EXECUTION_DATE), entry("enrollment.followUp", COLUMN_ENROLLMENT_FOLLOWUP), entry("status", COLUMN_EVENT_STATUS), entry("dueDate", COLUMN_EVENT_DUE_DATE), @@ -325,7 +325,7 @@ private List fetchEvents(EventQueryParams queryParams, PageParams pagePar event.setStoredBy(resultSet.getString(COLUMN_EVENT_STORED_BY)); event.setDueDate(resultSet.getTimestamp(COLUMN_EVENT_DUE_DATE)); - event.setExecutionDate(resultSet.getTimestamp(COLUMN_EVENT_EXECUTION_DATE)); + event.setOccurredDate(resultSet.getTimestamp(COLUMN_EVENT_EXECUTION_DATE)); event.setCreated(resultSet.getTimestamp(COLUMN_EVENT_CREATED)); event.setCreatedByUserInfo( EventUtils.jsonToUserInfo( @@ -977,8 +977,8 @@ private StringBuilder getFromWhereClause( fromBuilder.append(hlp.whereAnd()).append(orgUnitSql); } - if (params.getStartDate() != null) { - mapSqlParameterSource.addValue("startDate", params.getStartDate(), Types.DATE); + if (params.getOccurredStartDate() != null) { + mapSqlParameterSource.addValue("startDate", params.getOccurredStartDate(), Types.DATE); fromBuilder .append(hlp.whereAnd()) @@ -989,8 +989,9 @@ private StringBuilder getFromWhereClause( .append(" )) "); } - if (params.getEndDate() != null) { - mapSqlParameterSource.addValue("endDate", addDays(params.getEndDate(), 1), Types.DATE); + if (params.getOccurredEndDate() != null) { + mapSqlParameterSource.addValue( + "endDate", addDays(params.getOccurredEndDate(), 1), Types.DATE); fromBuilder .append(hlp.whereAnd()) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java index 456cef3ce660..09f9fdd750ff 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java @@ -68,7 +68,7 @@ private Event getEvent(ResultSet rs) throws SQLException { event.setId(rs.getLong(EventQuery.getColumnName(COLUMNS.ID))); event.setStatus(EventStatus.valueOf(rs.getString(EventQuery.getColumnName(COLUMNS.STATUS)))); - event.setExecutionDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.EXECUTION_DATE))); + event.setOccurredDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.EXECUTION_DATE))); event.setDueDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.DUE_DATE))); event.setStoredBy(rs.getString(EventQuery.getColumnName(COLUMNS.STOREDBY))); event.setCompletedBy(rs.getString(EventQuery.getColumnName(COLUMNS.COMPLETEDBY))); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterService.java index c1f4f26556c6..eb8e00ce51fa 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterService.java @@ -89,7 +89,7 @@ public List to(List events) { e.setEvent(event.getUid()); e.setStatus(event.getStatus()); - e.setOccurredAt(DateUtils.instantFromDate(event.getExecutionDate())); + e.setOccurredAt(DateUtils.instantFromDate(event.getOccurredDate())); e.setScheduledAt(DateUtils.instantFromDate(event.getDueDate())); e.setStoredBy(event.getStoredBy()); e.setCompletedBy(event.getCompletedBy()); @@ -211,7 +211,7 @@ private Event from( result.setEnrollment(getEnrollment(preheat, event.getEnrollment(), program)); result.setProgramStage(programStage); result.setOrganisationUnit(organisationUnit); - result.setExecutionDate(DateUtils.fromInstant(event.getOccurredAt())); + result.setOccurredDate(DateUtils.fromInstant(event.getOccurredAt())); result.setDueDate(DateUtils.fromInstant(event.getScheduledAt())); if (event.getAttributeOptionCombo().isNotBlank()) { @@ -242,8 +242,8 @@ private Event from( if (program.isRegistration() && result.getDueDate() == null - && result.getExecutionDate() != null) { - result.setDueDate(result.getExecutionDate()); + && result.getOccurredDate() != null) { + result.setDueDate(result.getOccurredDate()); } for (DataValue dataValue : event.getDataValues()) { diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/mappers/EventMapper.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/mappers/EventMapper.java index 0a8f8bd3178c..66bebe6c02aa 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/mappers/EventMapper.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/mappers/EventMapper.java @@ -56,7 +56,7 @@ public interface EventMapper extends PreheatMapper { @Mapping(target = "eventDataValues") @Mapping(target = "notes") @Mapping(target = "dueDate") - @Mapping(target = "executionDate") + @Mapping(target = "occurredDate") @Mapping(target = "completedDate") @Mapping(target = "completedBy") @Mapping(target = "deleted") diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterServiceTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterServiceTest.java index 6a669b928aa7..8a5153657367 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterServiceTest.java @@ -115,7 +115,7 @@ void setUpTest() { event.setAutoFields(); event.setAttributeOptionCombo(createCategoryOptionCombo('C')); event.setCreated(today); - event.setExecutionDate(today); + event.setOccurredDate(today); event.setEnrollment(enrollment); event.setOrganisationUnit(organisationUnit); event.setProgramStage(programStage); diff --git a/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java b/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java index e94514efec37..ac5512fc916b 100644 --- a/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java +++ b/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java @@ -1653,7 +1653,7 @@ public static Event createEvent( OrganisationUnit organisationUnit, Set dataValues) { Event event = createEvent(programStage, enrollment, organisationUnit); - event.setExecutionDate(new Date()); + event.setOccurredDate(new Date()); event.setStatus(EventStatus.ACTIVE); event.setEventDataValues(dataValues); return event; diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsServiceTest.java index 7bdf31775ce3..e5d7bfd1252e 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsServiceTest.java @@ -417,7 +417,7 @@ public void setUpTest() throws IOException, InterruptedException { // Program Stage Instances (Events) Event eventA1 = createEvent(psA, piA, ouI); eventA1.setDueDate(jan15); - eventA1.setExecutionDate(jan15); + eventA1.setOccurredDate(jan15); eventA1.setUid("event0000A1"); eventA1.setEventDataValues( Set.of( @@ -426,7 +426,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventA2 = createEvent(psA, piA, ouJ); eventA2.setDueDate(feb15); - eventA2.setExecutionDate(feb15); + eventA2.setOccurredDate(feb15); eventA2.setUid("event0000A2"); eventA2.setEventDataValues( Set.of( @@ -435,7 +435,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventA3 = createEvent(psA, piA, ouK); eventA3.setDueDate(mar15); - eventA3.setExecutionDate(mar15); + eventA3.setOccurredDate(mar15); eventA3.setUid("event0000A3"); eventA3.setEventDataValues( Set.of( @@ -444,7 +444,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventB1 = createEvent(psB, piB, ouI); eventB1.setDueDate(jan15); - eventB1.setExecutionDate(jan15); + eventB1.setOccurredDate(jan15); eventB1.setUid("event0000B1"); eventB1.setEventDataValues( Set.of(new EventDataValue(deA.getUid(), "10"), new EventDataValue(deB.getUid(), "A"))); @@ -452,7 +452,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventB2 = createEvent(psB, piB, ouI); eventB2.setDueDate(jan20); - eventB2.setExecutionDate(jan20); + eventB2.setOccurredDate(jan20); eventB2.setUid("event0000B2"); eventB2.setEventDataValues( Set.of(new EventDataValue(deA.getUid(), "20"), new EventDataValue(deB.getUid(), "B"))); @@ -460,7 +460,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventB3 = createEvent(psB, piB, ouJ); eventB3.setDueDate(jan15); - eventB3.setExecutionDate(jan15); + eventB3.setOccurredDate(jan15); eventB3.setUid("event0000B3"); eventB3.setEventDataValues( Set.of(new EventDataValue(deA.getUid(), "30"), new EventDataValue(deB.getUid(), "C"))); @@ -468,7 +468,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventB4 = createEvent(psB, piB, ouJ); eventB4.setDueDate(jan20); - eventB4.setExecutionDate(jan20); + eventB4.setOccurredDate(jan20); eventB4.setUid("event0000B4"); eventB4.setEventDataValues( Set.of(new EventDataValue(deA.getUid(), "40"), new EventDataValue(deB.getUid(), "D"))); @@ -476,7 +476,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventB5 = createEvent(psB, piB, ouI); eventB5.setDueDate(feb15); - eventB5.setExecutionDate(feb15); + eventB5.setOccurredDate(feb15); eventB5.setUid("event0000B5"); eventB5.setEventDataValues( Set.of(new EventDataValue(deA.getUid(), "50"), new EventDataValue(deB.getUid(), "E"))); @@ -484,7 +484,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventB6 = createEvent(psB, piB, ouI); eventB6.setDueDate(feb15Noon); - eventB6.setExecutionDate(feb15Noon); + eventB6.setOccurredDate(feb15Noon); eventB6.setUid("event0000B6"); eventB6.setEventDataValues( Set.of(new EventDataValue(deA.getUid(), "60"), new EventDataValue(deB.getUid(), "F"))); @@ -492,7 +492,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventB7 = createEvent(psB, piB, ouJ); eventB7.setDueDate(feb15); - eventB7.setExecutionDate(feb15); + eventB7.setOccurredDate(feb15); eventB7.setUid("event0000B7"); eventB7.setEventDataValues( Set.of(new EventDataValue(deA.getUid(), "70"), new EventDataValue(deB.getUid(), "G"))); @@ -500,7 +500,7 @@ public void setUpTest() throws IOException, InterruptedException { Event eventB8 = createEvent(psB, piB, ouJ); eventB8.setDueDate(feb15Noon); - eventB8.setExecutionDate(feb15Noon); + eventB8.setOccurredDate(feb15Noon); eventB8.setUid("event0000B8"); eventB8.setEventDataValues( Set.of(new EventDataValue(deA.getUid(), "80"), new EventDataValue(deB.getUid(), "H"))); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/EventImportTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/EventImportTest.java index 6700ef018587..3c05a7869eec 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/EventImportTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/EventImportTest.java @@ -641,7 +641,7 @@ void testVerifyEventCanBeUpdatedUsingProgramOnly() throws IOException { assertThat(psi.getOrganisationUnit().getUid(), is(psi2.getOrganisationUnit().getUid())); assertThat(psi.getAttributeOptionCombo().getUid(), is(psi2.getAttributeOptionCombo().getUid())); assertThat(psi.getStatus().getValue(), is(psi2.getStatus().getValue())); - assertThat(psi.getExecutionDate(), is(psi2.getExecutionDate())); + assertThat(psi.getOccurredDate(), is(psi2.getOccurredDate())); assertThat(psi.getCompletedDate(), is(psi2.getCompletedDate())); assertThat(psi.getCompletedBy(), is(psi2.getCompletedBy())); assertThat(psi.isDeleted(), is(psi2.isDeleted())); @@ -688,7 +688,7 @@ void testVerifyEventUncompleteSetsCompletedDateToNull() throws IOException { assertThat(psi.getOrganisationUnit().getUid(), is(psi2.getOrganisationUnit().getUid())); assertThat(psi.getAttributeOptionCombo().getUid(), is(psi2.getAttributeOptionCombo().getUid())); assertThat(psi2.getStatus(), is(EventStatus.ACTIVE)); - assertThat(psi.getExecutionDate(), is(psi2.getExecutionDate())); + assertThat(psi.getOccurredDate(), is(psi2.getOccurredDate())); assertThat(psi2.getCompletedDate(), is(nullValue())); assertThat(psi.getCompletedBy(), is(psi2.getCompletedBy())); assertThat(psi.isDeleted(), is(psi2.isDeleted())); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/maintenance/MaintenanceServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/maintenance/MaintenanceServiceTest.java index b7a26a27a0fa..ec3bb7a06bd5 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/maintenance/MaintenanceServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/maintenance/MaintenanceServiceTest.java @@ -190,12 +190,12 @@ public void setUpTest() { event.setUid("PSUID-B"); event.setOrganisationUnit(organisationUnit); event.setEnrollment(enrollment); - event.setExecutionDate(new Date()); + event.setOccurredDate(new Date()); eventWithTeiAssociation = new Event(enrollmentWithTeiAssociation, stageA); eventWithTeiAssociation.setUid("PSUID-C"); eventWithTeiAssociation.setOrganisationUnit(organisationUnit); eventWithTeiAssociation.setEnrollment(enrollmentWithTeiAssociation); - eventWithTeiAssociation.setExecutionDate(new Date()); + eventWithTeiAssociation.setOccurredDate(new Date()); eventService.addEvent(eventWithTeiAssociation); relationshipType = createPersonToPersonRelationshipType('A', program, trackedEntityType, false); relationshipTypeService.addRelationshipType(relationshipType); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/notification/ProgramNotificationMessageRendererTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/notification/ProgramNotificationMessageRendererTest.java index 3bf2705995f3..a2344d5ea537 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/notification/ProgramNotificationMessageRendererTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/notification/ProgramNotificationMessageRendererTest.java @@ -221,7 +221,7 @@ protected void setUpTest() throws Exception { eventA = new Event(enrollmentA, programStageA); eventA.setOrganisationUnit(organisationUnitA); eventA.setDueDate(enrollmentDate); - eventA.setExecutionDate(new Date()); + eventA.setOccurredDate(new Date()); eventA.setUid("PSI-UID"); eventDataValueA = new EventDataValue(); eventDataValueA.setDataElement(dataElementA.getUid()); @@ -326,8 +326,8 @@ void testRendererForMessageWithEventDate() { NotificationMessage notificationMessage = programStageNotificationMessageRenderer.render(eventA, programNotificationTemplate); assertEquals( - "message is " + formatDate(eventA.getExecutionDate()), notificationMessage.getMessage()); + "message is " + formatDate(eventA.getOccurredDate()), notificationMessage.getMessage()); assertEquals( - "subject is " + formatDate(eventA.getExecutionDate()), notificationMessage.getSubject()); + "subject is " + formatDate(eventA.getOccurredDate()), notificationMessage.getSubject()); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/predictor/EventPredictionServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/predictor/EventPredictionServiceTest.java index 441c6c20ac06..32e356aa6983 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/predictor/EventPredictionServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/predictor/EventPredictionServiceTest.java @@ -261,8 +261,8 @@ public void setUpTest() { eventService.createEvent(enrollment, stageA, dateMar20, dateMar20, orgUnitA); Event stageInstanceB = eventService.createEvent(enrollment, stageA, dateApr10, dateApr10, orgUnitA); - stageInstanceA.setExecutionDate(dateMar20); - stageInstanceB.setExecutionDate(dateApr10); + stageInstanceA.setOccurredDate(dateMar20); + stageInstanceB.setOccurredDate(dateApr10); stageInstanceA.setAttributeOptionCombo(defaultCombo); stageInstanceB.setAttributeOptionCombo(defaultCombo); eventService.addEvent(stageInstanceA); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEngineTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEngineTest.java index 106b152a7475..682e03ca5891 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEngineTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEngineTest.java @@ -649,7 +649,7 @@ private void setupEvents() { enrollmentService.updateEnrollment(enrollmentS); Event eventA = new Event(enrollmentA, programStageA); eventA.setDueDate(enrollmentDate); - eventA.setExecutionDate(new Date()); + eventA.setOccurredDate(new Date()); eventA.setUid("UID-PS1"); eventService.addEvent(eventA); eventDataValueDate = new EventDataValue(); @@ -669,24 +669,24 @@ private void setupEvents() { Event eventDate = new Event(enrollmentA, programStageAge); eventDate.setDueDate(enrollmentDate); - eventDate.setExecutionDate(psEventDate); + eventDate.setOccurredDate(psEventDate); eventDate.setUid("UID-PS12"); eventDate.setEventDataValues(Sets.newHashSet(eventDataValueDate)); eventService.addEvent(eventDate); Event eventAge = new Event(enrollmentA, programStageAge); eventAge.setDueDate(enrollmentDate); - eventAge.setExecutionDate(psEventDate); + eventAge.setOccurredDate(psEventDate); eventAge.setUid("UID-PS13"); eventAge.setEventDataValues(Sets.newHashSet(eventDataValueAge, eventDataValueWithOptionSet)); eventService.addEvent(eventAge); Event eventB = new Event(enrollmentA, programStageB); eventB.setDueDate(enrollmentDate); - eventB.setExecutionDate(new Date()); + eventB.setOccurredDate(new Date()); eventB.setUid("UID-PS2"); eventService.addEvent(eventB); Event eventC = new Event(enrollmentA, programStageC); eventC.setDueDate(enrollmentDate); - eventC.setExecutionDate(new Date()); + eventC.setOccurredDate(new Date()); eventC.setUid("UID-PS3"); eventService.addEvent(eventC); enrollmentA.getEvents().addAll(Sets.newHashSet(eventA, eventB, eventC, eventAge)); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/trackedentity/TrackerAccessManagerTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/trackedentity/TrackerAccessManagerTest.java index dcf1f5fed3c1..0eca5ba2c47a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/trackedentity/TrackerAccessManagerTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/trackedentity/TrackerAccessManagerTest.java @@ -164,7 +164,7 @@ protected void setUpTest() { eventA.setProgramStage(programStageA); eventA.setOrganisationUnit(orgUnitA); eventA.setStatus(EventStatus.COMPLETED); - eventA.setExecutionDate(new Date()); + eventA.setOccurredDate(new Date()); manager.save(eventA, false); eventB = new Event(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java index 5f68933ee4ad..1f2ddc8fe58b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java @@ -628,7 +628,7 @@ void shouldReturnPaginatedEventsWithNotesGivenNonDefaultPageSize() eventParamsBuilder .orgUnitUid(orgUnit.getUid()) .events(Set.of("pTzf9KYMk72", "D9PbzJY8bJM")) - .orderBy("executionDate", SortDirection.DESC) + .orderBy("occurredDate", SortDirection.DESC) .build(); Page firstPage = eventService.getEvents(operationParams, new PageParams(1, 1, false)); @@ -674,7 +674,7 @@ void shouldReturnPaginatedPublicEventsWithMultipleCategoryOptionsGivenNonDefault eventParamsBuilder .orgUnitUid(orgUnit.getUid()) .programUid(program.getUid()) - .orderBy("executionDate", SortDirection.DESC) + .orderBy("occurredDate", SortDirection.DESC) .build(); Page firstPage = eventService.getEvents(operationParams, new PageParams(1, 3, false)); @@ -704,7 +704,7 @@ void shouldReturnPaginatedEventsWithMultipleCategoryOptionsGivenNonDefaultPageSi eventParamsBuilder .orgUnitUid(orgUnit.getUid()) .programUid(program.getUid()) - .orderBy("executionDate", SortDirection.DESC) + .orderBy("occurredDate", SortDirection.DESC) .build(); Page events = eventService.getEvents(params, new PageParams(1, 2, true)); @@ -974,7 +974,7 @@ void shouldOrderEventsByOccurredAtDesc() throws ForbiddenException, BadRequestEx EventOperationParams params = eventParamsBuilder .orgUnitUid(orgUnit.getUid()) - .orderBy("executionDate", SortDirection.DESC) + .orderBy("occurredDate", SortDirection.DESC) .build(); List events = getEvents(params); @@ -987,7 +987,7 @@ void shouldOrderEventsByOccurredAtAsc() throws ForbiddenException, BadRequestExc EventOperationParams params = eventParamsBuilder .orgUnitUid(orgUnit.getUid()) - .orderBy("executionDate", SortDirection.ASC) + .orderBy("occurredDate", SortDirection.ASC) .build(); List events = getEvents(params); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java index b0c34ccea24a..8b9743878a76 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java @@ -208,8 +208,8 @@ void testExportEventsWithExecutionAndUpdateDates() operationParamsBuilder .enrollments(Set.of("TvctPPhpD8z")) .programStageUid(programStage.getUid()) - .startDate(getDate(2018, 1, 1)) - .endDate(getDate(2020, 1, 29)) + .occurredAfter(getDate(2018, 1, 1)) + .occurredBefore(getDate(2020, 1, 29)) .skipChangedBefore(getDate(2018, 1, 1)) .build(); @@ -276,11 +276,11 @@ void testExportEventsWithDatesIncludingTimeStamp() () -> assertEquals( "2019-01-25T12:10:38.100", - DateUtils.getIso8601NoTz(event.getExecutionDate()), + DateUtils.getIso8601NoTz(event.getOccurredDate()), () -> String.format( "Expected %s to be in %s", - event.getExecutionDate(), "2019-01-25T12:10:38.100")), + event.getOccurredDate(), "2019-01-25T12:10:38.100")), () -> assertEquals( "2019-01-28T12:32:38.100", diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java index 0b90c0681517..1bd60004f83f 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java @@ -274,7 +274,7 @@ protected void setUpTest() throws Exception { eventA.setProgramStage(programStageA1); eventA.setOrganisationUnit(orgUnitA); eventA.setAttributeOptionCombo(defaultCategoryOptionCombo); - eventA.setExecutionDate(parseDate("2021-05-27T12:05:00.000")); + eventA.setOccurredDate(parseDate("2021-05-27T12:05:00.000")); eventA.setDueDate(parseDate("2021-02-27T12:05:00.000")); eventA.setCompletedDate(parseDate("2021-02-27T11:05:00.000")); eventA.setCompletedBy("herb"); @@ -788,8 +788,8 @@ void shouldReturnEmptyIfEnrollmentOccurredPassedDateAndTime() @Test void shouldReturnTrackedEntityIfEventOccurredBetweenPassedDateAndTimes() throws ForbiddenException, NotFoundException, BadRequestException { - Date oneHourBeforeEventDate = oneHourBefore(eventA.getExecutionDate()); - Date oneHourAfterEventDate = oneHourAfter(eventA.getExecutionDate()); + Date oneHourBeforeOccurredDate = oneHourBefore(eventA.getOccurredDate()); + Date oneHourAfterOccurredDate = oneHourAfter(eventA.getOccurredDate()); TrackedEntityOperationParams operationParams = TrackedEntityOperationParams.builder() @@ -797,8 +797,8 @@ void shouldReturnTrackedEntityIfEventOccurredBetweenPassedDateAndTimes() .organisationUnits(Set.of(orgUnitA.getUid())) .orgUnitMode(SELECTED) .eventStatus(EventStatus.ACTIVE) - .eventStartDate(oneHourBeforeEventDate) - .eventEndDate(oneHourAfterEventDate) + .eventStartDate(oneHourBeforeOccurredDate) + .eventEndDate(oneHourAfterOccurredDate) .user(user) .build(); @@ -810,8 +810,8 @@ void shouldReturnTrackedEntityIfEventOccurredBetweenPassedDateAndTimes() @Test void shouldReturnEmptyIfEventOccurredBeforePassedDateAndTimes() throws ForbiddenException, NotFoundException, BadRequestException { - Date oneHourAfterEventDate = oneHourAfter(eventA.getExecutionDate()); - Date twoHoursAfterEventDate = twoHoursAfter(eventA.getExecutionDate()); + Date oneHourAfterOccurredDate = oneHourAfter(eventA.getOccurredDate()); + Date twoHoursAfterOccurredDate = twoHoursAfter(eventA.getOccurredDate()); TrackedEntityOperationParams operationParams = TrackedEntityOperationParams.builder() @@ -819,8 +819,8 @@ void shouldReturnEmptyIfEventOccurredBeforePassedDateAndTimes() .organisationUnits(Set.of(orgUnitA.getUid())) .orgUnitMode(SELECTED) .eventStatus(EventStatus.ACTIVE) - .eventStartDate(oneHourAfterEventDate) - .eventEndDate(twoHoursAfterEventDate) + .eventStartDate(oneHourAfterOccurredDate) + .eventEndDate(twoHoursAfterOccurredDate) .user(user) .build(); @@ -832,8 +832,8 @@ void shouldReturnEmptyIfEventOccurredBeforePassedDateAndTimes() @Test void shouldReturnEmptyIfEventOccurredAfterPassedDateAndTimes() throws ForbiddenException, NotFoundException, BadRequestException { - Date oneHourBeforeEventDate = oneHourBefore(eventA.getExecutionDate()); - Date twoHoursBeforeEventDate = twoHoursBefore(eventA.getExecutionDate()); + Date oneHourBeforeOccurredDate = oneHourBefore(eventA.getOccurredDate()); + Date twoHoursBeforeOccurredDate = twoHoursBefore(eventA.getOccurredDate()); TrackedEntityOperationParams operationParams = TrackedEntityOperationParams.builder() @@ -841,8 +841,8 @@ void shouldReturnEmptyIfEventOccurredAfterPassedDateAndTimes() .organisationUnits(Set.of(orgUnitA.getUid())) .orgUnitMode(SELECTED) .eventStatus(EventStatus.ACTIVE) - .eventStartDate(twoHoursBeforeEventDate) - .eventEndDate(oneHourBeforeEventDate) + .eventStartDate(twoHoursBeforeOccurredDate) + .eventEndDate(oneHourBeforeOccurredDate) .user(user) .build(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/validation/AnalyticsValidationServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/validation/AnalyticsValidationServiceTest.java index 5c0185965fe1..c8570862b9d4 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/validation/AnalyticsValidationServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/validation/AnalyticsValidationServiceTest.java @@ -232,8 +232,8 @@ public void setUpTest() { eventService.createEvent(enrollment, stageA, dateMar20, dateMar20, orgUnitA); Event stageInstanceB = eventService.createEvent(enrollment, stageA, dateApr10, dateApr10, orgUnitA); - stageInstanceA.setExecutionDate(dateMar20); - stageInstanceB.setExecutionDate(dateApr10); + stageInstanceA.setOccurredDate(dateMar20); + stageInstanceB.setOccurredDate(dateApr10); stageInstanceA.setAttributeOptionCombo(defaultCombo); stageInstanceB.setAttributeOptionCombo(defaultCombo); eventService.addEvent(stageInstanceA); diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/trackedentity/TrackedEntitiesExportControllerTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/trackedentity/TrackedEntitiesExportControllerTest.java index c311c6392042..632d6f54e7c8 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/trackedentity/TrackedEntitiesExportControllerTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/trackedentity/TrackedEntitiesExportControllerTest.java @@ -587,7 +587,7 @@ void shouldGetNoEventRelationshipsWhenEventHasRelationshipsAndFieldsExcludeEvent private Event eventWithDataValue(Enrollment enrollment) { Event event = new Event(enrollment, programStage, enrollment.getOrganisationUnit()); event.setAutoFields(); - event.setExecutionDate(DateUtils.parseDate(EVENT_OCCURRED_AT)); + event.setOccurredDate(DateUtils.parseDate(EVENT_OCCURRED_AT)); dataElement = createDataElement('A'); dataElement.setValueType(ValueType.TEXT); diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventMapper.java index efd1a43ec87e..4a60b6485908 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventMapper.java @@ -72,7 +72,7 @@ public interface EventMapper entry("event", "uid"), entry("followUp", "enrollment.followUp"), entry("followup", "enrollment.followUp"), // Deprecated 2.41 - entry("occurredAt", "executionDate"), + entry("occurredAt", "occurredDate"), entry("orgUnit", "organisationUnit.uid"), entry("program", "enrollment.program.uid"), entry("programStage", "programStage.uid"), @@ -89,7 +89,7 @@ public interface EventMapper @Mapping(target = "enrollment", source = "enrollment.uid") @Mapping(target = "trackedEntity", source = "enrollment.trackedEntity.uid") @Mapping(target = "orgUnit", source = "organisationUnit.uid") - @Mapping(target = "occurredAt", source = "executionDate") + @Mapping(target = "occurredAt", source = "occurredDate") @Mapping(target = "scheduledAt", source = "dueDate") @Mapping(target = "legacyFollowUp", source = "enrollment.followup") // Deprecated 2.41 @Mapping(target = "followUp", source = "enrollment.followup") diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapper.java index 5d35ab0a39c2..4a6fa703a003 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapper.java @@ -122,8 +122,8 @@ public EventOperationParams map(RequestParams requestParams) throws BadRequestEx .orgUnitMode(orgUnitMode) .assignedUserMode(requestParams.getAssignedUserMode()) .assignedUsers(UID.toValueSet(assignedUsers)) - .startDate(requestParams.getOccurredAfter()) - .endDate(requestParams.getOccurredBefore()) + .occurredAfter(requestParams.getOccurredAfter()) + .occurredBefore(requestParams.getOccurredBefore()) .scheduledAfter(requestParams.getScheduledAfter()) .scheduledBefore(requestParams.getScheduledBefore()) .updatedAfter(requestParams.getUpdatedAfter()) diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java index 022c600fe9ba..02fb108a0248 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java @@ -99,7 +99,7 @@ default EnrollmentStatus from(ProgramStatus programStatus) { @Mapping(target = "programStage", source = "programStage.uid") @Mapping(target = "enrollment", source = "enrollment.uid") @Mapping(target = "orgUnit", source = "organisationUnit.uid") - @Mapping(target = "occurredAt", source = "executionDate") + @Mapping(target = "occurredAt", source = "occurredDate") @Mapping(target = "scheduledAt", source = "dueDate") @Mapping(target = "followUp", source = "enrollment.followup") @Mapping(target = "legacyFollowUp", source = "enrollment.followup") diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java index 2877d38a5d44..2d9f2d427f0d 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java @@ -231,8 +231,8 @@ void testMappingOccurredAfterBefore() throws BadRequestException { EventOperationParams params = mapper.map(requestParams); - assertEquals(occurredAfter, params.getStartDate()); - assertEquals(occurredBefore, params.getEndDate()); + assertEquals(occurredAfter, params.getOccurredAfter()); + assertEquals(occurredBefore, params.getOccurredBefore()); } @Test From 421fc2141c6152f3c68c398cecec720d3f6bcf98 Mon Sep 17 00:00:00 2001 From: Maikel Arabori <51713408+maikelarabori@users.noreply.github.com> Date: Thu, 2 Nov 2023 14:15:13 +0100 Subject: [PATCH 17/63] feat: Support 'created' in Ev. Vis. [DHIS2-16096] (#15574) --- .../eventvisualization/SimpleDimension.java | 3 ++- .../EventVisualizationControllerTest.java | 21 +++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/eventvisualization/SimpleDimension.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/eventvisualization/SimpleDimension.java index 5a08f2d47599..09c643c0cd80 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/eventvisualization/SimpleDimension.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/eventvisualization/SimpleDimension.java @@ -63,7 +63,8 @@ public enum Type { ENROLLMENT_DATE("enrollmentDate", PERIOD), INCIDENT_DATE("incidentDate", PERIOD), SCHEDULE_DATE("scheduledDate", PERIOD), - LAST_UPDATE_DATE("lastUpdated", PERIOD), + LAST_UPDATED_DATE("lastUpdated", PERIOD), + CREATED_DATE("created", PERIOD), EVENT_STATUS("eventStatus", DATA_X), PROGRAM_STATUS("programStatus", DATA_X), CREATED_BY("createdBy", DATA_X), diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java index 525a039d7ef5..3c6a3d417b4d 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/EventVisualizationControllerTest.java @@ -613,6 +613,14 @@ void testPostMultiPrograms() { "id": "2023-01-21_2023-02-01" } ] + }, + { + "dimension": "created", + "items": [ + { + "id": "2021-01-21_2021-02-01" + } + ] } ], "filters": [ @@ -696,8 +704,10 @@ void testPostMultiPrograms() { assertThat( response.get("columnDimensions").node().value().toString(), - is(equalTo(""" -["deabcdefghP.deabcdefghB","deabcdefghC","deabcdefghP.eventDate"]"""))); + is( + equalTo( + """ +["deabcdefghP.deabcdefghB","deabcdefghC","deabcdefghP.eventDate","created"]"""))); assertThat( response.get("filterDimensions").node().value().toString(), @@ -765,6 +775,13 @@ void testPostMultiPrograms() { {"id":"deabcdefghP"}"""))); assertThat(columnsNode2.get("dimension").value().toString(), is(equalTo("eventDate"))); + JsonNode columnsNode3 = response.get("columns").node().element(3); + assertThat( + columnsNode3.get("items").value().toString(), + is(equalTo(""" +[{"id":"2021-01-21_2021-02-01"}]"""))); + assertThat(columnsNode3.get("dimension").value().toString(), is(equalTo("created"))); + JsonNode filtersNode0 = response.get("filters").node().element(0); assertThat( filtersNode0.get("items").element(0).get("code").value().toString(), From 11ffcfd5a7a02c3f0e0e6a793642a2f2699b3a12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:19:13 +0100 Subject: [PATCH 18/63] chore(deps): bump io.github.classgraph:classgraph in /dhis-2 (#15582) Bumps [io.github.classgraph:classgraph](https://github.com/classgraph/classgraph) from 4.8.163 to 4.8.164. - [Release notes](https://github.com/classgraph/classgraph/releases) - [Commits](https://github.com/classgraph/classgraph/compare/classgraph-4.8.163...classgraph-4.8.164) --- updated-dependencies: - dependency-name: io.github.classgraph:classgraph dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index a22cf83b9a57..46b41057a58a 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -166,7 +166,7 @@ 2.31.2 4.1.100.Final - 4.8.163 + 4.8.164 0.2.1.1 From b787c6d03542f5633d5c7c738c11fe634ad90ed8 Mon Sep 17 00:00:00 2001 From: tonsV2 Date: Fri, 3 Nov 2023 15:46:22 +0700 Subject: [PATCH 19/63] feat: expose the number of times and the delay between each attempt DHIS2 will try to connect to the database [DHIS2-16091] (#15485) * feat: expose database "acquire connection retry attempts" through dhis2.conf * chore: expose delay between each attempt --- .../dhis/external/conf/ConfigurationKey.java | 24 +++++++++++++++++++ .../dhis/datasource/DatabasePoolUtils.java | 24 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/ConfigurationKey.java b/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/ConfigurationKey.java index 63e8e3360825..eef5843af120 100644 --- a/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/ConfigurationKey.java +++ b/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/ConfigurationKey.java @@ -151,12 +151,36 @@ public enum ConfigurationKey { */ CONNECTION_POOL_ACQUIRE_INCR("connection.pool.acquire_incr", "5", false), + /** + * Determines how many times the system will try to acquire a connection before giving up. If this + * value is less than or equal to zero, the system will keep trying indefinitely. (default: 30). + */ + CONNECTION_POOL_ACQUIRE_RETRY_ATTEMPTS("connection.pool.acquire_retry_attempts", "30", false), + + /** + * Determines the delay in milliseconds, c3p0 will wait between acquire attempts. (default: 1000) + */ + CONNECTION_POOL_ACQUIRE_RETRY_DELAY("connection.pool.acquire_retry_delay", "1", false), + /** * Determines how many connections at a time will try to acquire when the pool is exhausted. * (default: 5). */ ANALYTICS_CONNECTION_POOL_ACQUIRE_INCR("analytics.connection.pool.acquire_incr", "5", false), + /** + * Determines how many times the system will try to acquire a connection before giving up. If this + * value is less than or equal to zero, the system will keep trying indefinitely. (default: 30). + */ + ANALYTICS_CONNECTION_POOL_ACQUIRE_RETRY_ATTEMPTS( + "analytics.connection.pool.acquire_retry_attempts", "30", false), + + /** + * Determines the delay in milliseconds, c3p0 will wait between acquire attempts. (default: 1000) + */ + ANALYTICS_CONNECTION_POOL_ACQUIRE_RETRY_DELAY( + "analytics.connection.pool.acquire_retry_delay", "1", false), + /** * Seconds a Connection can remain pooled but unused before being discarded. Zero means idle * connections never expire (default: 7200). diff --git a/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/datasource/DatabasePoolUtils.java b/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/datasource/DatabasePoolUtils.java index ffbcc6ef9d81..9d7d9ada1a9a 100644 --- a/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/datasource/DatabasePoolUtils.java +++ b/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/datasource/DatabasePoolUtils.java @@ -33,6 +33,8 @@ import static org.hisp.dhis.external.conf.ConfigurationKey.ANALYTICS_CONNECTION_DRIVER_CLASS; import static org.hisp.dhis.external.conf.ConfigurationKey.ANALYTICS_CONNECTION_PASSWORD; import static org.hisp.dhis.external.conf.ConfigurationKey.ANALYTICS_CONNECTION_POOL_ACQUIRE_INCR; +import static org.hisp.dhis.external.conf.ConfigurationKey.ANALYTICS_CONNECTION_POOL_ACQUIRE_RETRY_ATTEMPTS; +import static org.hisp.dhis.external.conf.ConfigurationKey.ANALYTICS_CONNECTION_POOL_ACQUIRE_RETRY_DELAY; import static org.hisp.dhis.external.conf.ConfigurationKey.ANALYTICS_CONNECTION_POOL_IDLE_CON_TEST_PERIOD; import static org.hisp.dhis.external.conf.ConfigurationKey.ANALYTICS_CONNECTION_POOL_INITIAL_SIZE; import static org.hisp.dhis.external.conf.ConfigurationKey.ANALYTICS_CONNECTION_POOL_MAX_IDLE_TIME; @@ -50,6 +52,8 @@ import static org.hisp.dhis.external.conf.ConfigurationKey.CONNECTION_DRIVER_CLASS; import static org.hisp.dhis.external.conf.ConfigurationKey.CONNECTION_PASSWORD; import static org.hisp.dhis.external.conf.ConfigurationKey.CONNECTION_POOL_ACQUIRE_INCR; +import static org.hisp.dhis.external.conf.ConfigurationKey.CONNECTION_POOL_ACQUIRE_RETRY_ATTEMPTS; +import static org.hisp.dhis.external.conf.ConfigurationKey.CONNECTION_POOL_ACQUIRE_RETRY_DELAY; import static org.hisp.dhis.external.conf.ConfigurationKey.CONNECTION_POOL_IDLE_CON_TEST_PERIOD; import static org.hisp.dhis.external.conf.ConfigurationKey.CONNECTION_POOL_INITIAL_SIZE; import static org.hisp.dhis.external.conf.ConfigurationKey.CONNECTION_POOL_MAX_IDLE_TIME; @@ -113,6 +117,10 @@ public enum ConfigKeyMapper { .put(CONNECTION_POOL_VALIDATION_TIMEOUT, ANALYTICS_CONNECTION_POOL_VALIDATION_TIMEOUT) /* C3P0-specific */ .put(CONNECTION_POOL_ACQUIRE_INCR, ANALYTICS_CONNECTION_POOL_ACQUIRE_INCR) + .put( + CONNECTION_POOL_ACQUIRE_RETRY_ATTEMPTS, + ANALYTICS_CONNECTION_POOL_ACQUIRE_RETRY_ATTEMPTS) + .put(CONNECTION_POOL_ACQUIRE_RETRY_DELAY, ANALYTICS_CONNECTION_POOL_ACQUIRE_RETRY_DELAY) .put(CONNECTION_POOL_MAX_IDLE_TIME, ANALYTICS_CONNECTION_POOL_MAX_IDLE_TIME) .put(CONNECTION_POOL_MIN_SIZE, ANALYTICS_CONNECTION_POOL_MIN_SIZE) .put(CONNECTION_POOL_INITIAL_SIZE, ANALYTICS_CONNECTION_POOL_INITIAL_SIZE) @@ -159,6 +167,9 @@ public static class PoolConfig { private String acquireIncrement; + private String acquireRetryAttempts; + private String acquireRetryDelay; + private String maxIdleTime; private ConfigKeyMapper mapper; @@ -271,6 +282,17 @@ private static DataSource createC3p0DbPool(PoolConfig config) firstNonNull( config.getAcquireIncrement(), dhisConfig.getProperty(mapper.getConfigKey(CONNECTION_POOL_ACQUIRE_INCR)))); + final int acquireRetryAttempts = + parseInt( + firstNonNull( + config.getAcquireRetryAttempts(), + dhisConfig.getProperty( + mapper.getConfigKey(CONNECTION_POOL_ACQUIRE_RETRY_ATTEMPTS)))); + final int acquireRetryDelay = + parseInt( + firstNonNull( + config.getAcquireRetryDelay(), + dhisConfig.getProperty(mapper.getConfigKey(CONNECTION_POOL_ACQUIRE_RETRY_DELAY)))); final int maxIdleTime = parseInt( firstNonNull( @@ -304,6 +326,8 @@ private static DataSource createC3p0DbPool(PoolConfig config) dataSource.setMinPoolSize(minPoolSize); dataSource.setInitialPoolSize(initialSize); dataSource.setAcquireIncrement(acquireIncrement); + dataSource.setAcquireRetryAttempts(acquireRetryAttempts); + dataSource.setAcquireRetryDelay(acquireRetryDelay); dataSource.setMaxIdleTime(maxIdleTime); dataSource.setTestConnectionOnCheckin(testOnCheckIn); dataSource.setTestConnectionOnCheckout(testOnCheckOut); From 2e9f30b5097f0a8bfcc6434204ecdf076c2880bb Mon Sep 17 00:00:00 2001 From: marc Date: Fri, 3 Nov 2023 10:01:48 +0100 Subject: [PATCH 20/63] fix: Return all visible events when no program specified [TECH-1663] (#15549) * fix: Return all visible events when no program specified [TECH-1663] * fix: Return search scope and capture scope in old api [TECH-1663] * fix: Return all visible events when mode selected [TECH-1663] * fix: Return all visible events when mode selected [TECH-1663] * fix: Return all visible events when mode selected [TECH-1663] * fix: Add capture scope org unit to integration test [TECH-1633] --- .../tracker/event/JdbcEventStore.java | 99 ++++-- .../tracker/export/event/JdbcEventStore.java | 113 ++++-- .../tracker/AclEventExporterTest.java | 62 ++-- .../RegistrationMultiEventsServiceTest.java | 3 +- .../OrderAndPaginationExporterTest.java | 12 +- .../export/event/AclEventExporterTest.java | 115 ++++-- .../tracker/event_and_enrollment.json | 198 ++++++++++- .../resources/tracker/simple_metadata.json | 335 +++++++++++++++++- 8 files changed, 795 insertions(+), 142 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java index 4212002f3e70..a25bc0f2c7f9 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java @@ -185,6 +185,16 @@ public class JdbcEventStore implements EventStore { private static final String AND = " AND "; + private static final String COLUMN_USER_UID = "u_uid"; + + private static final String COLUMN_ORG_UNIT_PATH = "ou_path"; + + private static final String USER_SCOPE_ORG_UNIT_PATH_LIKE_MATCH_QUERY = + " ou.path like CONCAT(orgunit.path, '%') "; + + private static final String CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY = + " ou.path like CONCAT(:" + COLUMN_ORG_UNIT_PATH + ", '%' ) "; + private static final Map QUERY_PARAM_COL_MAP = ImmutableMap.builder() .put(EVENT_ID, "psi_uid") @@ -296,10 +306,6 @@ public class JdbcEventStore implements EventStore { private static final String UPDATE_EVENT_SQL; - private static final String COLUMN_USER_UID = "u_uid"; - - private static final String COLUMN_ORG_UNIT_PATH = "ou_path"; - private static final String PERCENTAGE_SIGN = ", '%' "; /** @@ -2140,13 +2146,7 @@ private String createAccessibleSql( } mapSqlParameterSource.addValue(COLUMN_USER_UID, user.getUid()); - return " EXISTS(SELECT ss.organisationunitid " - + " FROM userteisearchorgunits ss " - + " JOIN organisationunit orgunit ON orgunit.organisationunitid = ss.organisationunitid " - + " JOIN userinfo u ON u.userinfoid = ss.userinfoid " - + " WHERE u.uid = :" - + COLUMN_USER_UID - + " AND ou.path like CONCAT(orgunit.path, '%')) "; + return getSearchAndCaptureScopeOrgUnitPathMatchQuery(USER_SCOPE_ORG_UNIT_PATH_LIKE_MATCH_QUERY); } private String createDescendantsSql( @@ -2155,54 +2155,54 @@ private String createDescendantsSql( if (isProgramRestricted(params.getProgram())) { return createCaptureScopeQuery( - user, - mapSqlParameterSource, - " AND ou.path like CONCAT(:" + COLUMN_ORG_UNIT_PATH + PERCENTAGE_SIGN + ")"); + user, mapSqlParameterSource, AND + CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY); } - return " ou.path like CONCAT(:" + COLUMN_ORG_UNIT_PATH + PERCENTAGE_SIGN + ") "; + mapSqlParameterSource.addValue(COLUMN_USER_UID, user.getUid()); + return getSearchAndCaptureScopeOrgUnitPathMatchQuery(CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY); } private String createChildrenSql( User user, EventSearchParams params, MapSqlParameterSource mapSqlParameterSource) { mapSqlParameterSource.addValue(COLUMN_ORG_UNIT_PATH, params.getOrgUnit().getPath()); + String customChildrenQuery = + " AND (ou.hierarchylevel = " + + params.getOrgUnit().getHierarchyLevel() + + " OR ou.hierarchylevel = " + + (params.getOrgUnit().getHierarchyLevel() + 1) + + " ) "; + if (isProgramRestricted(params.getProgram())) { - String childrenSqlClause = - " AND ou.path like CONCAT(:" - + COLUMN_ORG_UNIT_PATH - + PERCENTAGE_SIGN - + ") " - + " AND (ou.hierarchylevel = " - + params.getOrgUnit().getHierarchyLevel() - + " OR ou.hierarchylevel = " - + (params.getOrgUnit().getHierarchyLevel() + 1) - + " )"; - - return createCaptureScopeQuery(user, mapSqlParameterSource, childrenSqlClause); - } - - return " ou.path like CONCAT(:" - + COLUMN_ORG_UNIT_PATH - + PERCENTAGE_SIGN - + ") " - + " AND (ou.hierarchylevel = " - + params.getOrgUnit().getHierarchyLevel() - + " OR ou.hierarchylevel = " - + (params.getOrgUnit().getHierarchyLevel() + 1) - + " ) "; + return createCaptureScopeQuery( + user, + mapSqlParameterSource, + AND + CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY + customChildrenQuery); + } + + mapSqlParameterSource.addValue(COLUMN_USER_UID, user.getUid()); + return getSearchAndCaptureScopeOrgUnitPathMatchQuery( + CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY + customChildrenQuery); } private String createSelectedSql( User user, EventSearchParams params, MapSqlParameterSource mapSqlParameterSource) { mapSqlParameterSource.addValue(COLUMN_ORG_UNIT_PATH, params.getOrgUnit().getPath()); + String orgUnitPathEqualsMatchQuery = + " ou.path = :" + + COLUMN_ORG_UNIT_PATH + + " " + + AND + + USER_SCOPE_ORG_UNIT_PATH_LIKE_MATCH_QUERY; + if (isProgramRestricted(params.getProgram())) { String customSelectedClause = " AND ou.path = :" + COLUMN_ORG_UNIT_PATH + " "; return createCaptureScopeQuery(user, mapSqlParameterSource, customSelectedClause); } - return " ou.path = :" + COLUMN_ORG_UNIT_PATH + " "; + mapSqlParameterSource.addValue(COLUMN_USER_UID, user.getUid()); + return getSearchAndCaptureScopeOrgUnitPathMatchQuery(orgUnitPathEqualsMatchQuery); } private boolean isProgramRestricted(Program program) { @@ -2227,4 +2227,25 @@ private String createCaptureScopeQuery( + customClause + ") "; } + + private static String getSearchAndCaptureScopeOrgUnitPathMatchQuery(String orgUnitMatcher) { + return " (EXISTS(SELECT ss.organisationunitid " + + " FROM userteisearchorgunits ss " + + " JOIN userinfo u ON u.userinfoid = ss.userinfoid " + + " JOIN organisationunit orgunit ON orgunit.organisationunitid = ss.organisationunitid " + + " WHERE u.uid = :" + + COLUMN_USER_UID + + AND + + orgUnitMatcher + + " AND p.accesslevel in ('OPEN', 'AUDITED')) " + + " OR EXISTS(SELECT cs.organisationunitid " + + " FROM usermembership cs " + + " JOIN userinfo u ON u.userinfoid = cs.userinfoid " + + " JOIN organisationunit orgunit ON orgunit.organisationunitid = cs.organisationunitid " + + " WHERE u.uid = :" + + COLUMN_USER_UID + + AND + + orgUnitMatcher + + " )) "; + } } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java index 30678a7b5f00..4874c2eae089 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java @@ -179,7 +179,9 @@ class JdbcEventStore implements EventStore { private static final String COLUMN_USER_UID = "u_uid"; private static final String COLUMN_ORG_UNIT_PATH = "ou_path"; private static final String DEFAULT_ORDER = COLUMN_EVENT_ID + " desc"; - private static final String ORG_UNIT_PATH_LIKE_MATCH_QUERY = + private static final String USER_SCOPE_ORG_UNIT_PATH_LIKE_MATCH_QUERY = + " ou.path like CONCAT(orgunit.path, '%') "; + private static final String CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY = " ou.path like CONCAT(:" + COLUMN_ORG_UNIT_PATH + ", '%' ) "; /** @@ -1097,14 +1099,7 @@ private String createAccessibleSql( } mapSqlParameterSource.addValue(COLUMN_USER_UID, user.getUid()); - return " EXISTS(SELECT ss.organisationunitid " - + " FROM userteisearchorgunits ss " - + " JOIN organisationunit orgunit ON orgunit.organisationunitid = ss.organisationunitid " - + " JOIN userinfo u ON u.userinfoid = ss.userinfoid " - + " WHERE u.uid = :" - + COLUMN_USER_UID - + " AND ou.path like CONCAT(orgunit.path, '%') " - + ") "; + return getSearchAndCaptureScopeOrgUnitPathMatchQuery(USER_SCOPE_ORG_UNIT_PATH_LIKE_MATCH_QUERY); } private String createDescendantsSql( @@ -1113,60 +1108,64 @@ private String createDescendantsSql( if (isProgramRestricted(params.getProgram())) { return createCaptureScopeQuery( - user, mapSqlParameterSource, AND + ORG_UNIT_PATH_LIKE_MATCH_QUERY); + user, mapSqlParameterSource, AND + CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY); } - return ORG_UNIT_PATH_LIKE_MATCH_QUERY; + mapSqlParameterSource.addValue(COLUMN_USER_UID, user.getUid()); + return getSearchAndCaptureScopeOrgUnitPathMatchQuery(CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY); } private String createChildrenSql( User user, EventQueryParams params, MapSqlParameterSource mapSqlParameterSource) { mapSqlParameterSource.addValue(COLUMN_ORG_UNIT_PATH, params.getOrgUnit().getPath()); + String customChildrenQuery = + " AND (ou.hierarchylevel = " + + params.getOrgUnit().getHierarchyLevel() + + " OR ou.hierarchylevel = " + + (params.getOrgUnit().getHierarchyLevel() + 1) + + " ) "; + if (isProgramRestricted(params.getProgram())) { - String childrenSqlClause = - AND - + ORG_UNIT_PATH_LIKE_MATCH_QUERY - + " AND (ou.hierarchylevel = " - + params.getOrgUnit().getHierarchyLevel() - + " OR ou.hierarchylevel = " - + (params.getOrgUnit().getHierarchyLevel() + 1) - + " )"; - - return createCaptureScopeQuery(user, mapSqlParameterSource, childrenSqlClause); + return createCaptureScopeQuery( + user, + mapSqlParameterSource, + AND + CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY + customChildrenQuery); } - return ORG_UNIT_PATH_LIKE_MATCH_QUERY - + " AND (ou.hierarchylevel = " - + params.getOrgUnit().getHierarchyLevel() - + " OR ou.hierarchylevel = " - + (params.getOrgUnit().getHierarchyLevel() + 1) - + " ) "; + mapSqlParameterSource.addValue(COLUMN_USER_UID, user.getUid()); + return getSearchAndCaptureScopeOrgUnitPathMatchQuery( + CUSTOM_ORG_UNIT_PATH_LIKE_MATCH_QUERY + customChildrenQuery); } private String createSelectedSql( User user, EventQueryParams params, MapSqlParameterSource mapSqlParameterSource) { mapSqlParameterSource.addValue(COLUMN_ORG_UNIT_PATH, params.getOrgUnit().getPath()); - String orgUnitPathEqualsMatchQuery = " ou.path = :" + COLUMN_ORG_UNIT_PATH + " "; + String orgUnitPathEqualsMatchQuery = + " ou.path = :" + + COLUMN_ORG_UNIT_PATH + + " " + + AND + + USER_SCOPE_ORG_UNIT_PATH_LIKE_MATCH_QUERY; + if (isProgramRestricted(params.getProgram())) { String customSelectedClause = AND + orgUnitPathEqualsMatchQuery; return createCaptureScopeQuery(user, mapSqlParameterSource, customSelectedClause); } - return orgUnitPathEqualsMatchQuery; - } - - private boolean isProgramRestricted(Program program) { - return program != null && (program.isProtected() || program.isClosed()); - } - - private boolean isUserSearchScopeNotSet(User user) { - return user.getTeiSearchOrganisationUnits().isEmpty(); + mapSqlParameterSource.addValue(COLUMN_USER_UID, user.getUid()); + return getSearchAndCaptureScopeOrgUnitPathMatchQuery(orgUnitPathEqualsMatchQuery); } + /** + * Generates a sql to match the org unit event to the org unit(s) in the user's capture scope + * + * @param orgUnitMatcher specific condition to add depending on the ou mode + * @return a sql clause to add to the main query + */ private String createCaptureScopeQuery( - User user, MapSqlParameterSource mapSqlParameterSource, String customClause) { + User user, MapSqlParameterSource mapSqlParameterSource, String orgUnitMatcher) { mapSqlParameterSource.addValue(COLUMN_USER_UID, user.getUid()); return " EXISTS(SELECT cs.organisationunitid " @@ -1176,10 +1175,46 @@ private String createCaptureScopeQuery( + " WHERE u.uid = :" + COLUMN_USER_UID + " AND ou.path like CONCAT(orgunit.path, '%') " - + customClause + + orgUnitMatcher + ") "; } + /** + * Generates a sql to match the org unit event to the org unit(s) in the user's search and capture + * scope + * + * @param orgUnitMatcher specific condition to add depending on the ou mode + * @return a sql clause to add to the main query + */ + private static String getSearchAndCaptureScopeOrgUnitPathMatchQuery(String orgUnitMatcher) { + return " (EXISTS(SELECT ss.organisationunitid " + + " FROM userteisearchorgunits ss " + + " JOIN userinfo u ON u.userinfoid = ss.userinfoid " + + " JOIN organisationunit orgunit ON orgunit.organisationunitid = ss.organisationunitid " + + " WHERE u.uid = :" + + COLUMN_USER_UID + + AND + + orgUnitMatcher + + " AND p.accesslevel in ('OPEN', 'AUDITED')) " + + " OR EXISTS(SELECT cs.organisationunitid " + + " FROM usermembership cs " + + " JOIN userinfo u ON u.userinfoid = cs.userinfoid " + + " JOIN organisationunit orgunit ON orgunit.organisationunitid = cs.organisationunitid " + + " WHERE u.uid = :" + + COLUMN_USER_UID + + AND + + orgUnitMatcher + + " )) "; + } + + private boolean isProgramRestricted(Program program) { + return program != null && (program.isProtected() || program.isClosed()); + } + + private boolean isUserSearchScopeNotSet(User user) { + return user.getTeiSearchOrganisationUnits().isEmpty(); + } + /** * For dataElement params, restriction is set in inner join. For query params, restriction is set * in where clause. diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java index dd504ac2d152..7d9e651125c2 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java @@ -121,7 +121,7 @@ void shouldReturnEventsWhenProgramClosedOuModeDescendantsAndOrgUnitInCaptureScop } @Test - void shouldReturnEventsWhenNoProgramSpecifiedOuModeDescendantsAndOrgUnitInSearchScope() { + void shouldReturnEventsWhenNoProgramSpecifiedOuModeDescendantsAndRootOrgUnitRequested() { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventSearchParams params = new EventSearchParams(); params.setOrgUnit(get(OrganisationUnit.class, orgUnit.getUid())); @@ -133,12 +133,19 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeDescendantsAndOrgUnitInSearch events.isEmpty(), "Expected to find events when no program specified, ou mode descendants and org units in search scope"); assertContainsOnly( - events.stream().map(Event::getOrgUnit).collect(Collectors.toSet()), - List.of("uoNW0E3xXUy", "h4w96yEMlzO", "tSsGrtfRzjY")); + events.stream().map(Event::getUid).collect(Collectors.toSet()), + List.of( + "YKmfzHdjUDL", + "jxgFyJEMUPf", + "D9PbzJY8bJM", + "pTzf9KYMk72", + "JaRDIvcEcEx", + "SbUJzkxKYAG", + "gvULMgNiAfM")); } @Test - void shouldReturnEventsWhenNoProgramSpecifiedOuModeDescenadantsAndOrgUnitInSearchScope() { + void shouldReturnEventsWhenNoProgramSpecifiedOuModeDescendantsAndOrgUnitInSearchScope() { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventSearchParams params = new EventSearchParams(); params.setOrgUnit(get(OrganisationUnit.class, "uoNW0E3xXUy")); @@ -150,8 +157,8 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeDescenadantsAndOrgUnitInSearc events.isEmpty(), "Expected to find events when no program specified, ou mode descendants and org units in search scope"); assertContainsOnly( - events.stream().map(Event::getOrgUnit).collect(Collectors.toSet()), - List.of("uoNW0E3xXUy", "tSsGrtfRzjY")); + events.stream().map(Event::getUid).collect(Collectors.toSet()), + List.of("jxgFyJEMUPf", "JaRDIvcEcEx", "SbUJzkxKYAG", "gvULMgNiAfM")); } @Test @@ -190,8 +197,8 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeChildrenAndOrgUnitInSearchSco events.isEmpty(), "Expected to find events when no program specified, ou mode children and org units in search scope"); assertContainsOnly( - events.stream().map(Event::getOrgUnit).collect(Collectors.toSet()), - List.of("uoNW0E3xXUy", "h4w96yEMlzO")); + List.of("YKmfzHdjUDL", "jxgFyJEMUPf", "JaRDIvcEcEx", "D9PbzJY8bJM", "pTzf9KYMk72"), + events.stream().map(Event::getUid).collect(Collectors.toSet())); } @Test @@ -219,10 +226,10 @@ void shouldReturnEventsWhenProgramClosedOuModeSelectedAndOrgUnitInCaptureScope() @Test void shouldReturnEventsWhenNoProgramSpecifiedOuModeSelectedAndOrgUnitInSearchScope() { - injectSecurityContext(userService.getUser("FIgVWzUCkpw")); + injectSecurityContext(userService.getUser("nIidJVYpQQK")); EventSearchParams params = new EventSearchParams(); - params.setOrgUnit(get(OrganisationUnit.class, orgUnit.getUid())); + params.setOrgUnit(get(OrganisationUnit.class, "DiszpKrYNg8")); params.setOrgUnitSelectionMode(SELECTED); List events = eventService.getEvents(params).getEvents(); @@ -231,14 +238,9 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeSelectedAndOrgUnitInSearchSco events.isEmpty(), "Expected to find events when no program specified, ou mode descendants and org units in search scope"); - events.forEach( - e -> - assertEquals( - "h4w96yEMlzO", - e.getOrgUnit(), - "Expected to find selected org unit h4w96yEMlzO, but found " - + e.getOrgUnit() - + " instead")); + assertContainsOnly( + List.of("ck7DzdxqLqA", "OTmjvJDn0Fu", "kWjSezkXHVp"), + events.stream().map(Event::getUid).collect(Collectors.toList())); } @Test @@ -334,7 +336,13 @@ void shouldReturnAllEventsWhenOrgUnitModeAllAndNoOrgUnitProvided() { events.isEmpty(), "Expected to find events when ou mode ALL no program specified and no org unit provided"); assertContainsOnly( - List.of("h4w96yEMlzO", "uoNW0E3xXUy", "DiszpKrYNg8", "tSsGrtfRzjY"), + List.of( + "lbDXJBlvtZe", + "uoNW0E3xXUy", + "RojfDTBhoGC", + "tSsGrtfRzjY", + "h4w96yEMlzO", + "DiszpKrYNg8"), events.stream().map(Event::getOrgUnit).collect(Collectors.toSet())); } @@ -352,7 +360,13 @@ void shouldIgnoreRequestedOrgUnitAndReturnAllEventsWhenOrgUnitModeAllAndOrgUnitP events.isEmpty(), "Expected to find events when ou mode ALL no program specified and org unit provided"); assertContainsOnly( - List.of("h4w96yEMlzO", "uoNW0E3xXUy", "DiszpKrYNg8", "tSsGrtfRzjY"), + List.of( + "lbDXJBlvtZe", + "uoNW0E3xXUy", + "RojfDTBhoGC", + "tSsGrtfRzjY", + "h4w96yEMlzO", + "DiszpKrYNg8"), events.stream().map(Event::getOrgUnit).collect(Collectors.toSet())); } @@ -369,7 +383,13 @@ void shouldReturnAllEventsWhenOrgUnitModeAllAndNoOrgUnitProvidedAndUserNull() { events.isEmpty(), "Expected to find events when ou mode ALL no program specified and no org unit provided"); assertContainsOnly( - List.of("h4w96yEMlzO", "uoNW0E3xXUy", "DiszpKrYNg8", "tSsGrtfRzjY"), + List.of( + "lbDXJBlvtZe", + "uoNW0E3xXUy", + "RojfDTBhoGC", + "tSsGrtfRzjY", + "h4w96yEMlzO", + "DiszpKrYNg8"), events.stream().map(Event::getOrgUnit).collect(Collectors.toSet())); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/RegistrationMultiEventsServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/RegistrationMultiEventsServiceTest.java index b6a53beb8abe..1b91fa8dc92c 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/RegistrationMultiEventsServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/RegistrationMultiEventsServiceTest.java @@ -35,6 +35,7 @@ import com.google.common.collect.Lists; import java.util.Date; import java.util.HashSet; +import java.util.Set; import org.hamcrest.CoreMatchers; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.IdentifiableObjectManager; @@ -166,7 +167,7 @@ protected void setUpTest() throws Exception { manager.update(programStageA); manager.update(programStageB); manager.update(programA); - createUserAndInjectSecurityContext(true); + createUserAndInjectSecurityContext(Set.of(organisationUnitA, organisationUnitB), true); } @Test diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java index 1f2ddc8fe58b..7be8f923fa6b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java @@ -157,7 +157,9 @@ void shouldReturnPaginatedTrackedEntitiesGivenNonDefaultPageSize() assertAll( "second (last) page", () -> assertPager(2, 3, secondPage), - () -> assertEquals(List.of("QesgJkTyTCk", "guVNoAerxWo"), uids(secondPage.getItems()))); + () -> + assertEquals( + List.of("QesgJkTyTCk", "woitxQbWYNq", "guVNoAerxWo"), uids(secondPage.getItems()))); assertIsEmpty( trackedEntityService.getTrackedEntities(params, new PageParams(3, 3, false)).getItems()); @@ -180,7 +182,7 @@ void shouldReturnPaginatedTrackedEntitiesGivenNonDefaultPageSizeAndTotalPages() assertAll( "first page", - () -> assertPager(1, 3, 5, firstPage.getPager()), + () -> assertPager(1, 3, 6, firstPage.getPager()), () -> assertEquals( List.of("dUE514NMOlo", "mHWCacsGYYn", "QS6w44flWAf"), uids(firstPage.getItems()))); @@ -190,8 +192,10 @@ void shouldReturnPaginatedTrackedEntitiesGivenNonDefaultPageSizeAndTotalPages() assertAll( "second (last) page", - () -> assertPager(2, 3, 5, secondPage.getPager()), - () -> assertEquals(List.of("QesgJkTyTCk", "guVNoAerxWo"), uids(secondPage.getItems()))); + () -> assertPager(2, 3, 6, secondPage.getPager()), + () -> + assertEquals( + List.of("QesgJkTyTCk", "woitxQbWYNq", "guVNoAerxWo"), uids(secondPage.getItems()))); assertIsEmpty( trackedEntityService.getTrackedEntities(params, new PageParams(3, 3, true)).getItems()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java index 91f5a96e42a8..e9f6311b80e3 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java @@ -49,6 +49,7 @@ import java.util.Set; import java.util.stream.Collectors; import org.hisp.dhis.category.CategoryOption; +import org.hisp.dhis.common.BaseIdentifiableObject; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.feedback.BadRequestException; @@ -145,8 +146,15 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeDescendantsAndOrgUnitInSearch events.isEmpty(), "Expected to find events when no program specified, ou mode descendants and org units in search scope"); assertContainsOnly( - List.of("uoNW0E3xXUy", "h4w96yEMlzO", "tSsGrtfRzjY"), - events.stream().map(e -> e.getOrganisationUnit().getUid()).collect(Collectors.toSet())); + List.of( + "YKmfzHdjUDL", + "jxgFyJEMUPf", + "D9PbzJY8bJM", + "pTzf9KYMk72", + "JaRDIvcEcEx", + "SbUJzkxKYAG", + "gvULMgNiAfM"), + events.stream().map(BaseIdentifiableObject::getUid).collect(Collectors.toSet())); } @Test @@ -188,8 +196,8 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeChildrenAndOrgUnitInSearchSco events.isEmpty(), "Expected to find events when no program specified, ou mode children and org units in search scope"); assertContainsOnly( - List.of("uoNW0E3xXUy", "h4w96yEMlzO"), - events.stream().map(e -> e.getOrganisationUnit().getUid()).collect(Collectors.toSet())); + List.of("YKmfzHdjUDL", "jxgFyJEMUPf", "JaRDIvcEcEx", "D9PbzJY8bJM", "pTzf9KYMk72"), + events.stream().map(BaseIdentifiableObject::getUid).collect(Collectors.toSet())); } @Test @@ -253,24 +261,37 @@ void shouldReturnEventsWhenProgramClosedOuModeSelectedAndOrgUnitInCaptureScope() @Test void shouldReturnEventsWhenNoProgramSpecifiedOuModeSelectedAndOrgUnitInSearchScope() throws ForbiddenException, BadRequestException { + injectSecurityContext(userService.getUser("nIidJVYpQQK")); + EventOperationParams params = + EventOperationParams.builder().orgUnitUid("DiszpKrYNg8").orgUnitMode(SELECTED).build(); + + List events = eventService.getEvents(params); + + assertFalse( + events.isEmpty(), + "Expected to find events when no program specified, ou mode selected and org units in search scope"); + + assertContainsOnly( + List.of("ck7DzdxqLqA", "OTmjvJDn0Fu", "kWjSezkXHVp"), + events.stream().map(BaseIdentifiableObject::getUid).collect(Collectors.toSet())); + } + + @Test + void shouldReturnEventsWhenNoProgramSpecifiedOuModeSelectedAndOrgUnitInCaptureScope() + throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder().orgUnitUid(orgUnit.getUid()).orgUnitMode(SELECTED).build(); + EventOperationParams.builder().orgUnitUid("RojfDTBhoGC").orgUnitMode(SELECTED).build(); List events = eventService.getEvents(params); assertFalse( events.isEmpty(), - "Expected to find events when no program specified, ou mode descendants and org units in search scope"); + "Expected to find events when no program specified, ou mode selected and org units in capture scope"); - events.forEach( - e -> - assertEquals( - "h4w96yEMlzO", - e.getOrganisationUnit().getUid(), - "Expected to find selected org unit h4w96yEMlzO, but found " - + e.getOrganisationUnit().getUid() - + " instead")); + assertContainsOnly( + List.of("SbUJzkxKYAG"), + events.stream().map(BaseIdentifiableObject::getUid).collect(Collectors.toSet())); } @Test @@ -352,23 +373,6 @@ void shouldReturnEventsWhenProgramClosedOuModeCapture() + " instead")); } - @Test - void shouldReturnEventsWhenNoProgramAndOuModeAccessible() - throws ForbiddenException, BadRequestException { - injectSecurityContext(userService.getUser("nIidJVYpQQK")); - EventOperationParams params = EventOperationParams.builder().orgUnitMode(ACCESSIBLE).build(); - - List events = eventService.getEvents(params); - - assertFalse( - events.isEmpty(), - "Expected to find events when ou mode accessible and no program specified"); - - assertContainsOnly( - List.of("uoNW0E3xXUy", "tSsGrtfRzjY"), - events.stream().map(e -> e.getOrganisationUnit().getUid()).collect(Collectors.toSet())); - } - @Test void shouldReturnAccessibleOrgUnitEventsWhenNoOrgUnitSpecified() throws ForbiddenException, BadRequestException { @@ -457,7 +461,13 @@ void shouldReturnAllEventsWhenOrgUnitModeAllAndNoOrgUnitProvided() events.isEmpty(), "Expected to find events when ou mode ALL no program specified and no org unit provided"); assertContainsOnly( - List.of("h4w96yEMlzO", "uoNW0E3xXUy", "DiszpKrYNg8", "tSsGrtfRzjY"), + List.of( + "lbDXJBlvtZe", + "uoNW0E3xXUy", + "RojfDTBhoGC", + "tSsGrtfRzjY", + "h4w96yEMlzO", + "DiszpKrYNg8"), events.stream().map(e -> e.getOrganisationUnit().getUid()).collect(Collectors.toSet())); } @@ -474,7 +484,13 @@ void shouldReturnAllEventsWhenOrgUnitModeAllAndNoOrgUnitProvidedAndUserNull() events.isEmpty(), "Expected to find events when ou mode ALL no program specified and no org unit provided"); assertContainsOnly( - List.of("h4w96yEMlzO", "uoNW0E3xXUy", "DiszpKrYNg8", "tSsGrtfRzjY"), + List.of( + "lbDXJBlvtZe", + "uoNW0E3xXUy", + "RojfDTBhoGC", + "tSsGrtfRzjY", + "h4w96yEMlzO", + "DiszpKrYNg8"), events.stream().map(e -> e.getOrganisationUnit().getUid()).collect(Collectors.toSet())); } @@ -492,10 +508,41 @@ void shouldIgnoreRequestedOrgUnitAndReturnAllEventsWhenOrgUnitModeAllAndOrgUnitP events.isEmpty(), "Expected to find events when ou mode ALL no program specified and org unit provided"); assertContainsOnly( - List.of("h4w96yEMlzO", "uoNW0E3xXUy", "DiszpKrYNg8", "tSsGrtfRzjY"), + List.of( + "lbDXJBlvtZe", + "uoNW0E3xXUy", + "RojfDTBhoGC", + "tSsGrtfRzjY", + "h4w96yEMlzO", + "DiszpKrYNg8"), events.stream().map(e -> e.getOrganisationUnit().getUid()).collect(Collectors.toSet())); } + @Test + void + shouldReturnOnlyVisibleEventsInSearchAndCaptureScopeWhenNoProgramPresentOrgUnitModeAccessible() + throws ForbiddenException, BadRequestException { + injectSecurityContext(userService.getUser("nIidJVYpQQK")); + + EventOperationParams params = EventOperationParams.builder().orgUnitMode(ACCESSIBLE).build(); + + List events = eventService.getEvents(params); + + assertFalse( + events.isEmpty(), "Expected to find events when ou mode ACCESSIBLE and events visible"); + assertContainsOnly( + List.of( + "ck7DzdxqLqA", + "OTmjvJDn0Fu", + "kWjSezkXHVp", + "jxgFyJEMUPf", + "JaRDIvcEcEx", + "YKmfzHdjUDL", + "SbUJzkxKYAG", + "gvULMgNiAfM"), + events.stream().map(BaseIdentifiableObject::getUid).collect(Collectors.toSet())); + } + private T get(Class type, String uid) { T t = manager.get(type, uid); assertNotNull(t, () -> String.format("metadata with uid '%s' should have been created", uid)); diff --git a/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json b/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json index 31fe9146c4a4..4c8d09ca4b2a 100644 --- a/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json +++ b/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json @@ -223,6 +223,48 @@ "deleted": false, "potentialDuplicate": false, "relationships": [], + "attributes": [ + { + "valueType": "TEXT", + "attribute": { + "idScheme": "UID", + "identifier": "toDelete000" + }, + "value": "just day" + }, + { + "valueType": "TEXT", + "attribute": { + "idScheme": "UID", + "identifier": "toUpdate000" + }, + "value": "summer day" + }, + { + "valueType": "INTEGER", + "attribute": { + "idScheme": "UID", + "identifier": "numericAttr" + }, + "value": 91 + } + ], + "enrollments": [] + }, + { + "trackedEntity": "woitxQbWYNq", + "trackedEntityType": { + "idScheme": "UID", + "identifier": "ja8NY4PW7Xm" + }, + "orgUnit": { + "idScheme": "UID", + "identifier": "RojfDTBhoGC" + }, + "inactive": false, + "deleted": false, + "potentialDuplicate": false, + "relationships": [], "attributes": [ { "valueType": "TEXT", @@ -372,6 +414,78 @@ "relationships": [], "attributes": [], "notes": [] + }, + { + "enrollment": "qxOSXoEZkOA", + "createdAtClient": "2017-01-26T13:48:13.363", + "trackedEntity": "woitxQbWYNq", + "program": { + "idScheme": "UID", + "identifier": "YlUmbgnKWkd" + }, + "status": "ACTIVE", + "orgUnit": { + "idScheme": "UID", + "identifier": "RojfDTBhoGC" + }, + "orgUnitName": "test-orgunit-3", + "enrolledAt": "2021-02-28T12:05:00.000", + "occurredAt": "2021-02-28T12:05:00.000", + "dueDate": "2021-02-28T12:05:00.000", + "followUp": false, + "deleted": false, + "events": [], + "relationships": [], + "attributes": [], + "notes": [] + }, + { + "enrollment": "HDWTYSYkICe", + "createdAtClient": "2017-01-26T13:48:13.363", + "trackedEntity": "woitxQbWYNq", + "program": { + "idScheme": "UID", + "identifier": "SeeUNWLQmZk" + }, + "status": "ACTIVE", + "orgUnit": { + "idScheme": "UID", + "identifier": "DiszpKrYNg8" + }, + "orgUnitName": "test-orgunit-3", + "enrolledAt": "2021-02-28T12:05:00.000", + "occurredAt": "2021-02-28T12:05:00.000", + "dueDate": "2021-02-28T12:05:00.000", + "followUp": false, + "deleted": false, + "events": [], + "relationships": [], + "attributes": [], + "notes": [] + }, + { + "enrollment": "FXWSSZunTLk", + "createdAtClient": "2017-01-26T13:48:13.363", + "trackedEntity": "woitxQbWYNq", + "program": { + "idScheme": "UID", + "identifier": "sLngICFQjvH" + }, + "status": "ACTIVE", + "orgUnit": { + "idScheme": "UID", + "identifier": "lbDXJBlvtZe" + }, + "orgUnitName": "test-orgunit-3", + "enrolledAt": "2021-02-28T12:05:00.000", + "occurredAt": "2021-02-28T12:05:00.000", + "dueDate": "2021-02-28T12:05:00.000", + "followUp": false, + "deleted": false, + "events": [], + "relationships": [], + "attributes": [], + "notes": [] } ], "events": [ @@ -893,7 +1007,89 @@ "idScheme": "UID", "identifier": "HllvX50cXC0" }, - + "notes": [] + }, + { + "event": "SbUJzkxKYAG", + "status": "COMPLETED", + "program": { + "idScheme": "UID", + "identifier": "YlUmbgnKWkd" + }, + "programStage": { + "idScheme": "UID", + "identifier": "uLQthmAPTPq" + }, + "enrollment": "qxOSXoEZkOA", + "orgUnit": { + "idScheme": "UID", + "identifier": "RojfDTBhoGC" + }, + "relationships": [], + "occurredAt": "2019-01-28T00:00:00.000", + "scheduledAt": "2019-01-28T12:10:38.100", + "storedBy": "admin", + "followUp": true, + "deleted": false, + "attributeOptionCombo": { + "idScheme": "UID", + "identifier": "HllvX50cXC0" + } + }, + { + "event": "LCSfHnurnNB", + "status": "COMPLETED", + "program": { + "idScheme": "UID", + "identifier": "SeeUNWLQmZk" + }, + "programStage": { + "idScheme": "UID", + "identifier": "GmxBvezOlGA" + }, + "enrollment": "HDWTYSYkICe", + "orgUnit": { + "idScheme": "UID", + "identifier": "DiszpKrYNg8" + }, + "relationships": [], + "occurredAt": "2019-01-28T00:00:00.000", + "scheduledAt": "2019-01-28T12:10:38.100", + "storedBy": "admin", + "followUp": true, + "deleted": false, + "attributeOptionCombo": { + "idScheme": "UID", + "identifier": "HllvX50cXC0" + }, + "notes": [] + }, + { + "event": "YKmfzHdjUDL", + "status": "COMPLETED", + "program": { + "idScheme": "UID", + "identifier": "sLngICFQjvH" + }, + "programStage": { + "idScheme": "UID", + "identifier": "zydGjigJcJb" + }, + "enrollment": "FXWSSZunTLk", + "orgUnit": { + "idScheme": "UID", + "identifier": "lbDXJBlvtZe" + }, + "relationships": [], + "occurredAt": "2019-01-28T00:00:00.000", + "scheduledAt": "2019-01-28T12:10:38.100", + "storedBy": "admin", + "followUp": true, + "deleted": false, + "attributeOptionCombo": { + "idScheme": "UID", + "identifier": "HllvX50cXC0" + }, "notes": [] } ], diff --git a/dhis-2/dhis-test-integration/src/test/resources/tracker/simple_metadata.json b/dhis-2/dhis-test-integration/src/test/resources/tracker/simple_metadata.json index 0123bc92777d..ebe7a300b8ae 100644 --- a/dhis-2/dhis-test-integration/src/test/resources/tracker/simple_metadata.json +++ b/dhis-2/dhis-test-integration/src/test/resources/tracker/simple_metadata.json @@ -1243,6 +1243,132 @@ "userAccesses": [], "programStageSections": [], "programStageDataElements": [] + }, + { + "lastUpdated": "2020-05-31T11:41:22.426", + "id": "uLQthmAPTPq", + "created": "2020-05-31T09:02:52.687", + "name": "test-program-stage-low-level-org-unit", + "allowGenerateNextVisit": false, + "preGenerateUID": false, + "publicAccess": "rwrw----", + "description": "test-program-stage-low-level-org-unit", + "openAfterEnrollment": false, + "repeatable": true, + "remindCompleted": false, + "displayGenerateEventBox": true, + "generatedByEnrollmentDate": false, + "validationStrategy": "ON_COMPLETE", + "autoGenerateEvent": true, + "sortOrder": 1, + "hideDueDate": false, + "blockEntryForm": false, + "enableUserAssignment": false, + "minDaysFromStart": 0, + "program": { + "id": "YlUmbgnKWkd" + }, + "lastUpdatedBy": { + "id": "FIgVWzUCkpw" + }, + "user": { + "id": "FIgVWzUCkpw" + }, + "notificationTemplates": [ + { + "id": "FdIeUL4gyoB" + } + ], + "translations": [], + "userGroupAccesses": [], + "attributeValues": [], + "userAccesses": [], + "programStageSections": [], + "programStageDataElements": [] + }, + { + "lastUpdated": "2020-05-31T11:41:22.426", + "id": "GmxBvezOlGA", + "created": "2020-05-31T09:02:52.687", + "name": "test-program-stage-low-level-org-unit", + "allowGenerateNextVisit": false, + "preGenerateUID": false, + "publicAccess": "rwrw----", + "description": "test-program-stage-low-level-org-unit", + "openAfterEnrollment": false, + "repeatable": true, + "remindCompleted": false, + "displayGenerateEventBox": true, + "generatedByEnrollmentDate": false, + "validationStrategy": "ON_COMPLETE", + "autoGenerateEvent": true, + "sortOrder": 1, + "hideDueDate": false, + "blockEntryForm": false, + "enableUserAssignment": false, + "minDaysFromStart": 0, + "program": { + "id": "SeeUNWLQmZk" + }, + "lastUpdatedBy": { + "id": "FIgVWzUCkpw" + }, + "user": { + "id": "FIgVWzUCkpw" + }, + "notificationTemplates": [ + { + "id": "FdIeUL4gyoB" + } + ], + "translations": [], + "userGroupAccesses": [], + "attributeValues": [], + "userAccesses": [], + "programStageSections": [], + "programStageDataElements": [] + }, + { + "lastUpdated": "2020-05-31T11:41:22.426", + "id": "zydGjigJcJb", + "created": "2020-05-31T09:02:52.687", + "name": "test-program-stage-low-level-org-unit", + "allowGenerateNextVisit": false, + "preGenerateUID": false, + "publicAccess": "rwrw----", + "description": "test-program-stage-low-level-org-unit", + "openAfterEnrollment": false, + "repeatable": true, + "remindCompleted": false, + "displayGenerateEventBox": true, + "generatedByEnrollmentDate": false, + "validationStrategy": "ON_COMPLETE", + "autoGenerateEvent": true, + "sortOrder": 1, + "hideDueDate": false, + "blockEntryForm": false, + "enableUserAssignment": false, + "minDaysFromStart": 0, + "program": { + "id": "SeeUNWLQmZk" + }, + "lastUpdatedBy": { + "id": "FIgVWzUCkpw" + }, + "user": { + "id": "FIgVWzUCkpw" + }, + "notificationTemplates": [ + { + "id": "FdIeUL4gyoB" + } + ], + "translations": [], + "userGroupAccesses": [], + "attributeValues": [], + "userAccesses": [], + "programStageSections": [], + "programStageDataElements": [] } ], "users": [ @@ -1554,12 +1680,15 @@ "userAccesses": [], "teiSearchOrganisationUnits": [ { - "id": "uoNW0E3xXUy" + "id": "DiszpKrYNg8" } ], "organisationUnits": [ { "id": "uoNW0E3xXUy" + }, + { + "id": "lbDXJBlvtZe" } ], "dataViewOrganisationUnits": [ @@ -1613,13 +1742,35 @@ "translations": [] }, { - "id": "tSsGrtfRzjY", + "id": "lbDXJBlvtZe", + "name": "test-orgunit-2", + "level": 2, + "created": "2020-05-31T09:05:34.570", + "lastUpdated": "2020-05-31T11:41:22.385", + "shortName": "test-program-rule", + "path": "/h4w96yEMlzO/lbDXJBlvtZe", + "closedDate": "2020-12-27T00:00:00.000", + "openingDate": "2020-05-31T00:00:00.000", + "parent": { + "id": "h4w96yEMlzO" + }, + "lastUpdatedBy": { + "id": "M5zQapPyTZI" + }, + "user": { + "id": "M5zQapPyTZI" + }, + "attributeValues": [], + "translations": [] + }, + { + "id": "RojfDTBhoGC", "name": "test-orgunit-3", "level": 3, "created": "2020-05-31T09:05:34.570", "lastUpdated": "2020-05-31T11:41:22.385", "shortName": "test-program-rule", - "path": "/h4w96yEMlzO/uoNW0E3xXUy/tSsGrtfRzjY", + "path": "/h4w96yEMlzO/uoNW0E3xXUy/RojfDTBhoGC", "closedDate": "2020-12-27T00:00:00.000", "openingDate": "2020-05-31T00:00:00.000", "parent": { @@ -1634,6 +1785,28 @@ "attributeValues": [], "translations": [] }, + { + "id": "tSsGrtfRzjY", + "name": "test-orgunit-4", + "level": 4, + "created": "2020-05-31T09:05:34.570", + "lastUpdated": "2020-05-31T11:41:22.385", + "shortName": "test-program-rule", + "path": "/h4w96yEMlzO/uoNW0E3xXUy/RojfDTBhoGC/tSsGrtfRzjY", + "closedDate": "2020-12-27T00:00:00.000", + "openingDate": "2020-05-31T00:00:00.000", + "parent": { + "id": "RojfDTBhoGC" + }, + "lastUpdatedBy": { + "id": "M5zQapPyTZI" + }, + "user": { + "id": "M5zQapPyTZI" + }, + "attributeValues": [], + "translations": [] + }, { "id": "DiszpKrYNg8", "name": "test-orgunit-3", @@ -1971,6 +2144,162 @@ } ], "userAccesses": [] + }, + { + "id": "YlUmbgnKWkd", + "name": "test-program-low-level-org-unit", + "shortName": "test-program-low-level-org-unit", + "lastUpdated": "2020-05-31T11:41:22.438", + "created": "2020-05-31T09:02:52.718", + "publicAccess": "rwrw----", + "completeEventsExpiryDays": 0, + "ignoreOverdueEvents": false, + "skipOffline": false, + "minAttributesRequiredToSearch": 1, + "displayFrontPageList": false, + "onlyEnrollOnce": false, + "programType": "WITH_REGISTRATION", + "accessLevel": "CLOSED", + "version": 2, + "maxTeiCountToReturn": 0, + "selectIncidentDatesInFuture": false, + "displayIncidentDate": true, + "selectEnrollmentDatesInFuture": false, + "expiryDays": 0, + "useFirstStageDuringRegistration": false, + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "lastUpdatedBy": { + "id": "FIgVWzUCkpw" + }, + "trackedEntityType": { + "id": "ja8NY4PW7Xm" + }, + "user": { + "id": "FIgVWzUCkpw" + }, + "programTrackedEntityAttributes": [], + "notificationTemplates": [], + "translations": [], + "organisationUnits": [ + { + "id": "RojfDTBhoGC" + } + ], + "userGroupAccesses": [], + "programSections": [], + "attributeValues": [], + "programStages": [ + { + "id": "uLQthmAPTPq" + } + ], + "userAccesses": [] + }, + { + "id": "SeeUNWLQmZk", + "name": "test-program-low-level-org-unit", + "shortName": "test-program-low-level-org-unit", + "lastUpdated": "2020-05-31T11:41:22.438", + "created": "2020-05-31T09:02:52.718", + "publicAccess": "rwrw----", + "completeEventsExpiryDays": 0, + "ignoreOverdueEvents": false, + "skipOffline": false, + "minAttributesRequiredToSearch": 1, + "displayFrontPageList": false, + "onlyEnrollOnce": false, + "programType": "WITH_REGISTRATION", + "accessLevel": "CLOSED", + "version": 2, + "maxTeiCountToReturn": 0, + "selectIncidentDatesInFuture": false, + "displayIncidentDate": true, + "selectEnrollmentDatesInFuture": false, + "expiryDays": 0, + "useFirstStageDuringRegistration": false, + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "lastUpdatedBy": { + "id": "FIgVWzUCkpw" + }, + "trackedEntityType": { + "id": "ja8NY4PW7Xm" + }, + "user": { + "id": "FIgVWzUCkpw" + }, + "programTrackedEntityAttributes": [], + "notificationTemplates": [], + "translations": [], + "organisationUnits": [ + { + "id": "DiszpKrYNg8" + } + ], + "userGroupAccesses": [], + "programSections": [], + "attributeValues": [], + "programStages": [ + { + "id": "GmxBvezOlGA" + } + ], + "userAccesses": [] + }, + { + "id": "sLngICFQjvH", + "name": "test-program-low-level-org-unit", + "shortName": "test-program-low-level-org-unit", + "lastUpdated": "2020-05-31T11:41:22.438", + "created": "2020-05-31T09:02:52.718", + "publicAccess": "rwrw----", + "completeEventsExpiryDays": 0, + "ignoreOverdueEvents": false, + "skipOffline": false, + "minAttributesRequiredToSearch": 1, + "displayFrontPageList": false, + "onlyEnrollOnce": false, + "programType": "WITH_REGISTRATION", + "accessLevel": "OPEN", + "version": 2, + "maxTeiCountToReturn": 0, + "selectIncidentDatesInFuture": false, + "displayIncidentDate": true, + "selectEnrollmentDatesInFuture": false, + "expiryDays": 0, + "useFirstStageDuringRegistration": false, + "categoryCombo": { + "id": "bjDvmb4bfuf" + }, + "lastUpdatedBy": { + "id": "FIgVWzUCkpw" + }, + "trackedEntityType": { + "id": "ja8NY4PW7Xm" + }, + "user": { + "id": "FIgVWzUCkpw" + }, + "programTrackedEntityAttributes": [], + "notificationTemplates": [], + "translations": [], + "organisationUnits": [ + { + "id": "lbDXJBlvtZe" + } + ], + "userGroupAccesses": [], + "programSections": [], + "attributeValues": [], + "programStages": [ + { + "id": "zydGjigJcJb" + } + ], + "userAccesses": [] } ], "userRoles": [ From 0b88bbb65ce209b7c4dfd7971b7968dcd028d142 Mon Sep 17 00:00:00 2001 From: tonsV2 Date: Fri, 3 Nov 2023 19:13:51 +0700 Subject: [PATCH 21/63] ci: s/replaceAll/replace/ (#15588) --- jenkinsfiles/canary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkinsfiles/canary b/jenkinsfiles/canary index 7b0990371f15..1d3a0ac16c0a 100644 --- a/jenkinsfiles/canary +++ b/jenkinsfiles/canary @@ -71,7 +71,7 @@ pipeline { env.DATABASE_ID = "test-dbs-sierra-leone-dev-sql-gz" } else { env.IMAGE_TAG = env.GIT_BRANCH - branch = "-${env.GIT_BRANCH.replaceAll(".", "-")}" + branch = "-${env.GIT_BRANCH.replace(".", "-")}" dir('scripts/databases') { env.DATABASE_ID = sh( From 1253d7a660fe5b4b36d3f6b9a4401ba864398512 Mon Sep 17 00:00:00 2001 From: Giuseppe Nespolino Date: Sun, 5 Nov 2023 21:54:58 +0100 Subject: [PATCH 22/63] feat: remove program prefix from TEAs in CPL [DHIS2-16067] (#15579) * feat: no programUid prefix in dimension endpoint [DHIS2-16067] * feat: program prefix is not required for TEAs in CPL endpoint params [DHIS2-16067] * fix: sonarcloud warning [DHIS2-16067] * fix: e2e dimensions tests [DHIS2-16067] * fix: unit test [DHIS2-16067] --- .../java/org/hisp/dhis/common/QueryItem.java | 10 + .../processing/CommonQueryRequestMapper.java | 102 ++++---- .../analytics/event/QueryItemLocator.java | 13 +- .../data/DefaultEventDataQueryService.java | 12 +- .../event/data/DefaultQueryItemLocator.java | 20 +- .../dhis/analytics/tei/query/TeiFields.java | 45 +--- .../context/querybuilder/TeiQueryBuilder.java | 2 +- .../dhis/analytics/util/AnalyticsUtils.java | 16 +- .../analytics/AnalyticsDimensionsTest.java | 10 +- .../analytics/tei/TrackedEntityQueryTest.java | 233 ++++-------------- .../tei/TeiAnalyticsController.java | 3 +- .../dimension/DimensionMapperService.java | 32 ++- .../EnrollmentAnalyticsPrefixStrategy.java | 3 +- .../dimension/TeiAnalyticsPrefixStrategy.java | 4 +- .../BaseDimensionalItemObjectMapper.java | 5 +- .../dimension/DimensionMapperServiceTest.java | 99 ++++++++ 16 files changed, 314 insertions(+), 295 deletions(-) create mode 100644 dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/dimension/DimensionMapperServiceTest.java diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryItem.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryItem.java index 62b9f4036f24..39d0e28be97a 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryItem.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/QueryItem.java @@ -85,6 +85,16 @@ public class QueryItem implements GroupableItem { // Constructors // ------------------------------------------------------------------------- + public QueryItem(TrackedEntityAttribute item, LegendSet legendSet) { + this( + item, + null, + legendSet, + legendSet != null ? ValueType.TEXT : item.getValueType(), + item.getAggregationType(), + item.getOptionSet()); + } + public QueryItem(DimensionalItemObject item) { this.item = item; } diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/processing/CommonQueryRequestMapper.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/processing/CommonQueryRequestMapper.java index 69c89a940579..67f76a96ee2f 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/processing/CommonQueryRequestMapper.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/processing/CommonQueryRequestMapper.java @@ -29,8 +29,6 @@ import static java.util.Collections.emptySet; import static java.util.Collections.unmodifiableList; -import static java.util.function.Function.identity; -import static java.util.stream.Collectors.toList; import static org.hisp.dhis.analytics.EventOutputType.TRACKED_ENTITY_INSTANCE; import static org.hisp.dhis.analytics.common.params.dimension.DimensionParam.isStaticDimensionIdentifier; import static org.hisp.dhis.analytics.common.params.dimension.DimensionParamType.DATE_FILTERS; @@ -54,7 +52,6 @@ import java.util.Date; import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -62,7 +59,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.tuple.Pair; import org.hisp.dhis.analytics.DataQueryService; import org.hisp.dhis.analytics.common.CommonQueryRequest; import org.hisp.dhis.analytics.common.params.AnalyticsPagingParams; @@ -81,6 +77,7 @@ import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramService; +import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.webapi.controller.event.mapper.SortDirection; import org.springframework.stereotype.Component; @@ -111,29 +108,13 @@ public CommonParams map(CommonQueryRequest request) { dataQueryService.getUserOrgUnits(null, request.getUserOrgUnit()); List programs = getPrograms(request); - Map dimensionsByUid = - request.getDimension().stream().collect(Collectors.toMap(identity(), identity())); - - programs.stream() - .flatMap( - program -> - getProgramAttributes(List.of(program)) - .map(IdentifiableObject::getUid) - // We need fully qualified dimension identifiers. - .map(attributeUid -> Pair.of(program, attributeUid))) - .forEach( - fullyQualifiedDimension -> - dimensionsByUid.put( - fullyQualifiedDimension.getRight(), - fullyQualifiedDimension.getLeft().getUid() - + "." - + fullyQualifiedDimension.getRight())); - - // Removes all items already existing for which exists a fully qualified dimension name. - request.getDimension().removeIf(dimensionsByUid::containsKey); - - // Adds all dimensions from all programs. - request.getDimension().addAll(dimensionsByUid.values()); + // Adds all program attributes from all applicable programs as dimensions + request + .getDimension() + .addAll( + getProgramAttributes(programs) + .map(IdentifiableObject::getUid) + .collect(Collectors.toSet())); return CommonParams.builder() .programs(programs) @@ -199,7 +180,7 @@ private List getSortingParams( SORTING.getUidsGetter().apply(request).stream(), (sortRequest, index) -> toSortParam(index, sortRequest, request, programs, userOrgUnits)) - .collect(toList()); + .toList(); } /** @@ -240,12 +221,12 @@ private List getPrograms(CommonQueryRequest queryRequest) { boolean programsCouldNotBeRetrieved = programs.size() != queryRequest.getProgram().size(); if (programsCouldNotBeRetrieved) { - List foundProgramUids = programs.stream().map(Program::getUid).collect(toList()); + List foundProgramUids = programs.stream().map(Program::getUid).toList(); List missingProgramUids = Optional.of(queryRequest).map(CommonQueryRequest::getProgram).orElse(emptySet()).stream() .filter(uidFromRequest -> !foundProgramUids.contains(uidFromRequest)) - .collect(toList()); + .toList(); throw new IllegalQueryException(E7129, missingProgramUids); } @@ -276,19 +257,14 @@ private List> retrieveDimensionParams( dimensionParamType.getUidsGetter().apply(queryRequest); dimensionParams.addAll( - unmodifiableList( - dimensionsOrFilter.stream() - .map(CommonQueryRequestMapper::splitOnOrIfNecessary) - .map( - dof -> - toDimensionIdentifier( - dof, - dimensionParamType, - queryRequest, - programs, - userOrgUnits)) - .flatMap(Collection::stream) - .collect(toList()))); + dimensionsOrFilter.stream() + .map(CommonQueryRequestMapper::splitOnOrIfNecessary) + .map( + dof -> + toDimensionIdentifier( + dof, dimensionParamType, queryRequest, programs, userOrgUnits)) + .flatMap(Collection::stream) + .toList()); }); return unmodifiableList(dimensionParams); @@ -320,7 +296,7 @@ private List> toDimensionIdentifier( toDimensionIdentifier( dimensionAsString, dimensionParamType, queryRequest, programs, userOrgUnits)) .map(dimensionIdentifier -> dimensionIdentifier.withGroupId(groupId)) - .collect(toList()); + .toList(); } /** @@ -330,7 +306,7 @@ private List> toDimensionIdentifier( * @return the {@link List} of String. */ private static List splitOnOrIfNecessary(String dimensionAsString) { - return Arrays.stream(DIMENSION_OR_SEPARATOR.split(dimensionAsString)).collect(toList()); + return Arrays.stream(DIMENSION_OR_SEPARATOR.split(dimensionAsString)).toList(); } /** @@ -409,24 +385,38 @@ public DimensionIdentifier toDimensionIdentifier( dimensionIdentifier.getProgram(), dimensionIdentifier.getProgramStage(), dimensionParam); } - // If we reach here, it should be a queryItem. Objects of type queryItem - // need to be prefixed by programUid (program attributes, program - // indicators) and optionally by a programStageUid (Data Element). - if (dimensionIdentifier.hasProgram()) { - QueryItem queryItem = + QueryItem queryItem; + + if (!dimensionIdentifier.hasProgram() && !dimensionIdentifier.hasProgramStage()) { + // If we reach here, it should be a trackedEntityAttribute. + queryItem = + eventDataQueryService.getQueryItem( + dimensionIdentifier.getDimension().getUid(), null, TRACKED_ENTITY_INSTANCE); + + if (Objects.isNull(queryItem)) { + throw new IllegalQueryException(E7250, dimensionId); + } + + } else { + // If we reach here, it should be a queryItem. In this case it can be either + // a program indicator (with programUid prefix) or a Data Element + // (both program and program stage prefixes) + queryItem = eventDataQueryService.getQueryItem( dimensionIdentifier.getDimension().getUid(), dimensionIdentifier.getProgram().getElement(), TRACKED_ENTITY_INSTANCE); - // The fully qualified dimension identification is required here. - DimensionParam dimensionParam = DimensionParam.ofObject(queryItem, dimensionParamType, items); - - return DimensionIdentifier.of( - dimensionIdentifier.getProgram(), dimensionIdentifier.getProgramStage(), dimensionParam); + // TEA should only be specified without program prefix + if (queryItem.getItem() instanceof TrackedEntityAttribute) { + throw new IllegalQueryException(E7250, dimensionId); + } } - throw new IllegalQueryException(E7250, dimensionId); + return DimensionIdentifier.of( + dimensionIdentifier.getProgram(), + dimensionIdentifier.getProgramStage(), + DimensionParam.ofObject(queryItem, dimensionParamType, items)); } private static DimensionIdentifier parseAsStaticDimension( diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/QueryItemLocator.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/QueryItemLocator.java index b34f871da659..6f70d674aebe 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/QueryItemLocator.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/QueryItemLocator.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.analytics.event; +import java.util.Optional; import org.hisp.dhis.analytics.EventOutputType; import org.hisp.dhis.common.QueryItem; import org.hisp.dhis.program.Program; @@ -49,7 +50,7 @@ public interface QueryItemLocator { * uid}] - Relationship Type + Program Indicator [{rt uid}.{pi uid}] * *

If the provided dimension String is not matching any of the above elements, then a {@link - * IllegalQueryException} is thrown + * org.hisp.dhis.common.IllegalQueryException} is thrown * * @param dimension the dimension string. * @param program the {@link Program}. @@ -57,4 +58,14 @@ public interface QueryItemLocator { * @return a {@link QueryItem}. */ QueryItem getQueryItemFromDimension(String dimension, Program program, EventOutputType type); + + /** + * Same as {@link #getQueryItemFromDimension(String, Program, EventOutputType)} but without + * program. Used by Cross program linelisting application to get the query item for the tracked + * entity attribute. + * + * @param dimension the dimension string representing a tracked entity attribute uid. + * @return an Optional {@link QueryItem}. Empty if not found. + */ + Optional getQueryItemForTrackedEntityAttribute(String dimension); } diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java index c6926134e144..27fd03bcfe69 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java @@ -46,6 +46,7 @@ import static org.hisp.dhis.analytics.event.data.DefaultEventCoordinateService.COL_NAME_TEI_GEOMETRY; import static org.hisp.dhis.analytics.event.data.DefaultEventDataQueryService.SortableItems.isSortable; import static org.hisp.dhis.analytics.event.data.DefaultEventDataQueryService.SortableItems.translateItemIfNecessary; +import static org.hisp.dhis.analytics.util.AnalyticsUtils.illegalQueryExSupplier; import static org.hisp.dhis.analytics.util.AnalyticsUtils.throwIllegalQueryEx; import static org.hisp.dhis.common.DimensionalObject.DIMENSION_NAME_SEP; import static org.hisp.dhis.common.DimensionalObject.PERIOD_DIM_ID; @@ -515,7 +516,16 @@ public QueryItem getQueryItem(String dimensionString, Program program, EventOutp throwIllegalQueryEx(ErrorCode.E7222, dimensionString); } - QueryItem queryItem = queryItemLocator.getQueryItemFromDimension(split[0], program, type); + QueryItem queryItem; + if (Objects.isNull(program)) { + // support for querying program attributes by uid without passing the program + queryItem = + queryItemLocator + .getQueryItemForTrackedEntityAttribute(split[0]) + .orElseThrow(illegalQueryExSupplier(ErrorCode.E7224, dimensionString)); + } else { + queryItem = queryItemLocator.getQueryItemFromDimension(split[0], program, type); + } if (split.length > 1) // Filters specified { diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultQueryItemLocator.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultQueryItemLocator.java index a2322bd9aa27..b4872263141e 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultQueryItemLocator.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultQueryItemLocator.java @@ -28,9 +28,11 @@ package org.hisp.dhis.analytics.event.data; import static com.google.common.base.Preconditions.checkNotNull; +import static org.hisp.dhis.analytics.util.AnalyticsUtils.illegalQueryExSupplier; import static org.hisp.dhis.analytics.util.AnalyticsUtils.throwIllegalQueryEx; import static org.hisp.dhis.common.DimensionalObject.DIMENSION_IDENTIFIER_SEP; import static org.hisp.dhis.common.DimensionalObject.ITEM_SEP; +import static org.hisp.dhis.feedback.ErrorCode.E7224; import java.util.Collections; import java.util.Date; @@ -109,10 +111,7 @@ public QueryItem getQueryItemFromDimension( () -> getDynamicDimension(dimension) .orElseThrow( - () -> - new IllegalQueryException( - new ErrorMessage( - ErrorCode.E7224, dimension)))))); + illegalQueryExSupplier(E7224, dimension))))); } /** @@ -217,6 +216,19 @@ private Optional getTrackedEntityAttribute( return Optional.ofNullable(qi); } + /** + * Returns a QueryItem for a TrackedEntityAttribute + * + * @param dimension the uid of the TrackedEntityAttribute + * @return a QueryItem for a TrackedEntityAttribute + */ + @Override + public Optional getQueryItemForTrackedEntityAttribute(String dimension) { + return Optional.ofNullable(dimension) + .map(attributeService::getTrackedEntityAttribute) + .map(attribute -> new QueryItem(attribute, getLegendSet(dimension))); + } + private Optional getProgramIndicator( String dimension, Program program, LegendSet legendSet) { QueryItem qi = null; diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/TeiFields.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/TeiFields.java index 1ea7ddfdd7b7..20a02dd453ea 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/TeiFields.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/TeiFields.java @@ -30,7 +30,6 @@ import static java.lang.String.join; import static java.util.Arrays.stream; import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toSet; import static lombok.AccessLevel.PRIVATE; import static org.apache.commons.lang3.StringUtils.EMPTY; import static org.hisp.dhis.analytics.tei.query.context.QueryContextConstants.TEI_ALIAS; @@ -58,7 +57,6 @@ import org.hisp.dhis.analytics.tei.query.context.TeiStaticField; import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.common.GridHeader; -import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.QueryItem; import org.hisp.dhis.common.RepeatableStageParams; import org.hisp.dhis.common.ValueType; @@ -79,44 +77,23 @@ public class TeiFields { private static final String ENROLLMENT_COLUMN_PREFIX = "Enrollment"; /** - * Retrieves all object attributes from the given param encapsulating them into a stream of {@link + * Retrieves all TEAs attributes from the given param encapsulating them into a stream of {@link * Field}. * * @param teiQueryParams the {@link TeiQueryParams}. * @return a {@link Stream} of {@link Field}. */ public static Stream getDimensionFields(TeiQueryParams teiQueryParams) { - Set programAttributesUids = - teiQueryParams.getCommonParams().getPrograms().stream() - .map(Program::getProgramAttributes) - .flatMap(List::stream) - .map(programAttr -> programAttr.getAttribute().getUid()) - .collect(toSet()); - - Stream programAttributes = - teiQueryParams.getCommonParams().getPrograms().stream() - .map(Program::getProgramAttributes) - .flatMap(List::stream) - .map( - programAttr -> - Field.of( - TEI_ALIAS, - () -> programAttr.getAttribute().getUid(), - join( - ".", - programAttr.getProgram().getUid(), - programAttr.getAttribute().getUid()))); - - Stream trackedEntityAttributesFromType = - getTrackedEntityAttributes(teiQueryParams.getTrackedEntityType()) - .filter( - programTrackedEntityAttribute -> - !programAttributesUids.contains(programTrackedEntityAttribute.getUid())) - .map(IdentifiableObject::getUid) - .map(attr -> Field.of(TEI_ALIAS, () -> attr, attr)); - - // TET and program attribute uids. - return Stream.concat(trackedEntityAttributesFromType, programAttributes); + return Stream.concat( + teiQueryParams.getCommonParams().getPrograms().stream() + .map(Program::getProgramAttributes) + .flatMap(List::stream) + .map(ProgramTrackedEntityAttribute::getAttribute) + .map(TrackedEntityAttribute::getUid), + teiQueryParams.getTrackedEntityType().getTrackedEntityAttributes().stream() + .map(TrackedEntityAttribute::getUid)) + .distinct() + .map(attr -> Field.of(TEI_ALIAS, () -> attr, attr)); } /** diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/TeiQueryBuilder.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/TeiQueryBuilder.java index 4f2e7d42688b..94b085ad7ee4 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/TeiQueryBuilder.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/TeiQueryBuilder.java @@ -121,7 +121,7 @@ private static boolean isTei(DimensionIdentifier dimensionIdenti dimensionIdentifier.getDimensionIdentifierType() == TEI || // Will match all dimensionIdentifiers whose type is PROGRAM_ATTRIBUTE. - // e.g. {programUid}.{attributeUid} + // e.g. {attributeUid} isOfType(dimensionIdentifier, PROGRAM_ATTRIBUTE); } diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/util/AnalyticsUtils.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/util/AnalyticsUtils.java index b32a35e43505..7a02d97d90b9 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/util/AnalyticsUtils.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/util/AnalyticsUtils.java @@ -1011,7 +1011,21 @@ public static Double getBaseMonth(PeriodType periodType) { * @param args the arguments to provide to the error code message. */ public static void throwIllegalQueryEx(ErrorCode errorCode, Object... args) { - throw new IllegalQueryException(new ErrorMessage(errorCode, args)); + throw illegalQueryExSupplier(errorCode, args).get(); + } + + /** + * Returns a {@link Supplier} of {@link IllegalQueryException} using the given {@link ErrorCode}. + * The supplier can be used to throw an {@link IllegalQueryException} at a later point in time. + * This is useful when the exception should be thrown in a lambda expression. + * + * @param errorCode the {@link ErrorCode}. + * @param args the arguments to provide to the error code message. + * @return a {@link Supplier} of {@link IllegalQueryException}. + */ + public static Supplier illegalQueryExSupplier( + ErrorCode errorCode, Object... args) { + return () -> new IllegalQueryException(new ErrorMessage(errorCode, args)); } /** diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/AnalyticsDimensionsTest.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/AnalyticsDimensionsTest.java index b9bef42d6b83..2a24c5e97e46 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/AnalyticsDimensionsTest.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/AnalyticsDimensionsTest.java @@ -40,7 +40,9 @@ import static org.hamcrest.Matchers.startsWith; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -283,7 +285,7 @@ public void shouldReturnAllProgramAttributes() { "programs.programTrackedEntityAttributes.flatten().trackedEntityAttribute.id", String.class) .stream() - // .distinct() attributes can be duplicated in different programs + .distinct() .collect(Collectors.toList()); analyticsTeiActions @@ -308,6 +310,8 @@ public void shouldReturnAllDataElements() { .extractList( "programs.programStages.programStageDataElements.flatten().dataElement.id"); + Set distinctDataElements = new HashSet<>(dataElements); + analyticsTeiActions .query() .getDimensions( @@ -315,7 +319,7 @@ public void shouldReturnAllDataElements() { new QueryParamsBuilder().add("filter", "dimensionType:eq:DATA_ELEMENT")) .validate() .statusCode(200) - .body("dimensions", hasSize(equalTo(dataElements.size()))) - .body("dimensions.uid", everyItem(in(dataElements))); + .body("dimensions", hasSize(equalTo(distinctDataElements.size()))) + .body("dimensions.uid", everyItem(in(distinctDataElements))); } } diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/tei/TrackedEntityQueryTest.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/tei/TrackedEntityQueryTest.java index bbe2006ee24d..1aec4a759b5e 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/tei/TrackedEntityQueryTest.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/tei/TrackedEntityQueryTest.java @@ -64,10 +64,10 @@ private QueryParamsBuilder withDefaultHeaders(QueryParamsBuilder queryParamsBuil + "ouname," + "oucode," + "ounamehierarchy," - + "IpHINAT79UW.w75KJ2mc4zz," - + "IpHINAT79UW.zDhUuAYrxNC," - + "IpHINAT79UW.cejWyOfXge6," - + "IpHINAT79UW.lZGmxYbs97q"); + + "w75KJ2mc4zz," + + "zDhUuAYrxNC," + + "cejWyOfXge6," + + "lZGmxYbs97q"); } @Test @@ -77,7 +77,7 @@ void queryWithProgramAndProgramStageWhenTotalPagesIsFalse() { new QueryParamsBuilder() .add("dimension=ou:ImspTQPwCqd") .add("program=IpHINAT79UW") - .add("asc=IpHINAT79UW.w75KJ2mc4zz") + .add("asc=w75KJ2mc4zz") .add("lastUpdated=LAST_YEAR") .add("totalPages=false") .add("pageSize=100") @@ -168,34 +168,12 @@ void queryWithProgramAndProgramStageWhenTotalPagesIsFalse() { false, true); validateHeader( - response, - 10, - "IpHINAT79UW.w75KJ2mc4zz", - "First name", - "TEXT", - "java.lang.String", - false, - true); + response, 10, "w75KJ2mc4zz", "First name", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 11, - "IpHINAT79UW.zDhUuAYrxNC", - "Last name", - "TEXT", - "java.lang.String", - false, - true); - validateHeader( - response, 12, "IpHINAT79UW.cejWyOfXge6", "Gender", "TEXT", "java.lang.String", false, true); + response, 11, "zDhUuAYrxNC", "Last name", "TEXT", "java.lang.String", false, true); + validateHeader(response, 12, "cejWyOfXge6", "Gender", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 13, - "IpHINAT79UW.lZGmxYbs97q", - "Unique ID", - "TEXT", - "java.lang.String", - false, - true); + response, 13, "lZGmxYbs97q", "Unique ID", "TEXT", "java.lang.String", false, true); } @Test @@ -291,34 +269,12 @@ void queryWithProgramOnly() { false, true); validateHeader( - response, - 10, - "IpHINAT79UW.w75KJ2mc4zz", - "First name", - "TEXT", - "java.lang.String", - false, - true); + response, 10, "w75KJ2mc4zz", "First name", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 11, - "IpHINAT79UW.zDhUuAYrxNC", - "Last name", - "TEXT", - "java.lang.String", - false, - true); - validateHeader( - response, 12, "IpHINAT79UW.cejWyOfXge6", "Gender", "TEXT", "java.lang.String", false, true); + response, 11, "zDhUuAYrxNC", "Last name", "TEXT", "java.lang.String", false, true); + validateHeader(response, 12, "cejWyOfXge6", "Gender", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 13, - "IpHINAT79UW.lZGmxYbs97q", - "Unique ID", - "TEXT", - "java.lang.String", - false, - true); + response, 13, "lZGmxYbs97q", "Unique ID", "TEXT", "java.lang.String", false, true); // Validate the first three rows, as samples. validateRow( @@ -474,34 +430,12 @@ void queryWithProgramAndPagination() { false, true); validateHeader( - response, - 10, - "IpHINAT79UW.w75KJ2mc4zz", - "First name", - "TEXT", - "java.lang.String", - false, - true); - validateHeader( - response, - 11, - "IpHINAT79UW.zDhUuAYrxNC", - "Last name", - "TEXT", - "java.lang.String", - false, - true); + response, 10, "w75KJ2mc4zz", "First name", "TEXT", "java.lang.String", false, true); validateHeader( - response, 12, "IpHINAT79UW.cejWyOfXge6", "Gender", "TEXT", "java.lang.String", false, true); + response, 11, "zDhUuAYrxNC", "Last name", "TEXT", "java.lang.String", false, true); + validateHeader(response, 12, "cejWyOfXge6", "Gender", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 13, - "IpHINAT79UW.lZGmxYbs97q", - "Unique ID", - "TEXT", - "java.lang.String", - false, - true); + response, 13, "lZGmxYbs97q", "Unique ID", "TEXT", "java.lang.String", false, true); // Validate the first three rows, as samples. validateRow( @@ -575,7 +509,7 @@ public void queryWithProgramAndManyParams() { .add("dimension=cejWyOfXge6") .add("lastUpdated=LAST_10_YEARS") .add( - "headers=ouname,IpHINAT79UW.cejWyOfXge6,IpHINAT79UW.w75KJ2mc4zz,trackedentityinstanceuid,lastupdated,oucode") + "headers=ouname,cejWyOfXge6,w75KJ2mc4zz,trackedentityinstanceuid,lastupdated,oucode") .add("desc=lastupdated") .add("relativePeriodDate=2022-09-27"); @@ -615,17 +549,9 @@ public void queryWithProgramAndManyParams() { // Validate headers validateHeader( response, 0, "ouname", "Organisation unit name", "TEXT", "java.lang.String", false, true); + validateHeader(response, 1, "cejWyOfXge6", "Gender", "TEXT", "java.lang.String", false, true); validateHeader( - response, 1, "IpHINAT79UW.cejWyOfXge6", "Gender", "TEXT", "java.lang.String", false, true); - validateHeader( - response, - 2, - "IpHINAT79UW.w75KJ2mc4zz", - "First name", - "TEXT", - "java.lang.String", - false, - true); + response, 2, "w75KJ2mc4zz", "First name", "TEXT", "java.lang.String", false, true); validateHeader( response, 3, @@ -683,10 +609,10 @@ public void queryWithProgramDimensionAndFilter() { QueryParamsBuilder params = new QueryParamsBuilder() .add("program=IpHINAT79UW") - .add("dimension=ouname,IpHINAT79UW.w75KJ2mc4zz:eq:James") + .add("dimension=ouname,w75KJ2mc4zz:eq:James") .add("lastUpdated=LAST_10_YEARS") .add("includeMetadataDetails=false") - .add("headers=ouname,IpHINAT79UW.w75KJ2mc4zz,lastupdated") + .add("headers=ouname,w75KJ2mc4zz,lastupdated") .add("asc=lastupdated") .add("relativePeriodDate=2022-09-27"); @@ -727,14 +653,7 @@ public void queryWithProgramDimensionAndFilter() { validateHeader( response, 0, "ouname", "Organisation unit name", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 1, - "IpHINAT79UW.w75KJ2mc4zz", - "First name", - "TEXT", - "java.lang.String", - false, - true); + response, 1, "w75KJ2mc4zz", "First name", "TEXT", "java.lang.String", false, true); validateHeader( response, 2, @@ -805,8 +724,8 @@ public void queryWithProgramAndMultipleDynamicDimOrdering() { new QueryParamsBuilder() .add("program=IpHINAT79UW") .add("lastUpdated=LAST_10_YEARS") - .add("desc=IpHINAT79UW.w75KJ2mc4zz,IpHINAT79UW.zDhUuAYrxNC") - .add("headers=IpHINAT79UW.w75KJ2mc4zz,IpHINAT79UW.zDhUuAYrxNC") + .add("desc=w75KJ2mc4zz,zDhUuAYrxNC") + .add("headers=w75KJ2mc4zz,zDhUuAYrxNC") .add("relativePeriodDate=2022-09-27"); // When @@ -824,23 +743,9 @@ public void queryWithProgramAndMultipleDynamicDimOrdering() { // Validate headers validateHeader( - response, - 0, - "IpHINAT79UW.w75KJ2mc4zz", - "First name", - "TEXT", - "java.lang.String", - false, - true); + response, 0, "w75KJ2mc4zz", "First name", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 1, - "IpHINAT79UW.zDhUuAYrxNC", - "Last name", - "TEXT", - "java.lang.String", - false, - true); + response, 1, "zDhUuAYrxNC", "Last name", "TEXT", "java.lang.String", false, true); // Validate the first three rows, as samples. validateRow(response, 0, List.of("Willie", "Woods")); @@ -858,7 +763,7 @@ public void queryWithProgramAndEnrollmentStaticDimOrdering() { .add("program=IpHINAT79UW") .add("lastUpdated=LAST_10_YEARS") .add("desc=lastupdated,IpHINAT79UW.A03MvHHogjR.ouname") - .add("headers=ouname,IpHINAT79UW.lZGmxYbs97q") + .add("headers=ouname,lZGmxYbs97q") .add("relativePeriodDate=2022-09-27"); // When @@ -878,14 +783,7 @@ public void queryWithProgramAndEnrollmentStaticDimOrdering() { validateHeader( response, 0, "ouname", "Organisation unit name", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 1, - "IpHINAT79UW.lZGmxYbs97q", - "Unique ID", - "TEXT", - "java.lang.String", - false, - true); + response, 1, "lZGmxYbs97q", "Unique ID", "TEXT", "java.lang.String", false, true); // Validate the first three rows, as samples. validateRow(response, 0, List.of("Ngelehun CHC", "")); @@ -903,7 +801,7 @@ public void queryWithProgramAndMultipleEventDimOrdering() { .add("program=IpHINAT79UW") .add("desc=IpHINAT79UW.A03MvHHogjR.UXz7xuGCEhU,IpHINAT79UW.A03MvHHogjR.a3kGcGDCuk6") .add("lastUpdated=LAST_10_YEARS") - .add("headers=ouname,IpHINAT79UW.lZGmxYbs97q") + .add("headers=ouname,lZGmxYbs97q") .add("relativePeriodDate=2022-09-27"); // When @@ -923,14 +821,7 @@ public void queryWithProgramAndMultipleEventDimOrdering() { validateHeader( response, 0, "ouname", "Organisation unit name", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 1, - "IpHINAT79UW.lZGmxYbs97q", - "Unique ID", - "TEXT", - "java.lang.String", - false, - true); + response, 1, "lZGmxYbs97q", "Unique ID", "TEXT", "java.lang.String", false, true); // Validate the first three rows, as samples. validateRow(response, 0, List.of("Ngelehun CHC", "")); @@ -948,9 +839,8 @@ public void queryWithProgramAndProgramIndicatorOrdering() { .add("program=IpHINAT79UW") .add("dimension=IpHINAT79UW.A03MvHHogjR.p2Zxg0wcPQ3") .add("lastUpdated=LAST_10_YEARS") - .add( - "asc=IpHINAT79UW.A03MvHHogjR.p2Zxg0wcPQ3,IpHINAT79UW.zDhUuAYrxNC,IpHINAT79UW.w75KJ2mc4zz") - .add("headers=ouname,IpHINAT79UW.lZGmxYbs97q,IpHINAT79UW.A03MvHHogjR.p2Zxg0wcPQ3") + .add("asc=IpHINAT79UW.A03MvHHogjR.p2Zxg0wcPQ3,zDhUuAYrxNC,w75KJ2mc4zz") + .add("headers=ouname,lZGmxYbs97q,IpHINAT79UW.A03MvHHogjR.p2Zxg0wcPQ3") .add("relativePeriodDate=2022-09-27"); // When @@ -970,14 +860,7 @@ public void queryWithProgramAndProgramIndicatorOrdering() { validateHeader( response, 0, "ouname", "Organisation unit name", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 1, - "IpHINAT79UW.lZGmxYbs97q", - "Unique ID", - "TEXT", - "java.lang.String", - false, - true); + response, 1, "lZGmxYbs97q", "Unique ID", "TEXT", "java.lang.String", false, true); validateHeader( response, 2, @@ -1895,7 +1778,7 @@ public void queryWithProgramAndEnrollmentDateAndNegativeEnrollmentOffset() { .add("enrollmentDate=IpHINAT79UW[-1].LAST_YEAR") .add("desc=lastupdated") .add("relativePeriodDate=2023-04-03") - .add("headers=ouname,IpHINAT79UW.w75KJ2mc4zz,IpHINAT79UW.zDhUuAYrxNC"); + .add("headers=ouname,w75KJ2mc4zz,zDhUuAYrxNC"); // When ApiResponse response = analyticsTeiActions.query().get("nEenWmSyUEp", JSON, JSON, params); @@ -1914,23 +1797,9 @@ public void queryWithProgramAndEnrollmentDateAndNegativeEnrollmentOffset() { validateHeader( response, 0, "ouname", "Organisation unit name", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 1, - "IpHINAT79UW.w75KJ2mc4zz", - "First name", - "TEXT", - "java.lang.String", - false, - true); + response, 1, "w75KJ2mc4zz", "First name", "TEXT", "java.lang.String", false, true); validateHeader( - response, - 2, - "IpHINAT79UW.zDhUuAYrxNC", - "Last name", - "TEXT", - "java.lang.String", - false, - true); + response, 2, "zDhUuAYrxNC", "Last name", "TEXT", "java.lang.String", false, true); // Validate the first three rows, as samples. validateRow(response, 0, List.of("Ngelehun CHC", "John", "Kelly")); @@ -2022,7 +1891,7 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeCode() { new QueryParamsBuilder() .add("program=IpHINAT79UW") .add("dimension=IpHINAT79UW.ZzYYXq4fJie.cYGaxwK615G:IN:Negative-Conf") - .add("desc=IpHINAT79UW.w75KJ2mc4zz,IpHINAT79UW.zDhUuAYrxNC") + .add("desc=w75KJ2mc4zz,zDhUuAYrxNC") .add("relativePeriodDate=2016-01-01") .add("outputIdScheme=CODE"); @@ -2122,7 +1991,7 @@ public void queryWithProgramAndDimensionFilterUsingIdSchemeName() { new QueryParamsBuilder() .add("program=IpHINAT79UW") .add("dimension=IpHINAT79UW.ZzYYXq4fJie.cYGaxwK615G:IN:Negative-Conf") - .add("desc=IpHINAT79UW.w75KJ2mc4zz,IpHINAT79UW.zDhUuAYrxNC") + .add("desc=w75KJ2mc4zz,zDhUuAYrxNC") .add("relativePeriodDate=2016-01-01") .add("outputIdScheme=NAME"); @@ -2504,8 +2373,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeName() { "Ruiz", "Male", "", - "Positive", - "3681")); + "3681", + "Positive")); validateRow( response, @@ -2527,8 +2396,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeName() { "Gardner", "Female", "", - "Positive", - "3945")); + "3945", + "Positive")); validateRow( response, @@ -2550,8 +2419,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeName() { "Hart", "Female", "", - "Positive", - "3104")); + "3104", + "Positive")); } @Test @@ -2609,8 +2478,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeUid() { "Ruiz", "rBvjJYbMCVx", "", - "fWI0UiNZgMy", - "3681")); + "3681", + "fWI0UiNZgMy")); validateRow( response, @@ -2632,8 +2501,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeUid() { "Gardner", "Mnp3oXrpAbK", "", - "fWI0UiNZgMy", - "3945")); + "3945", + "fWI0UiNZgMy")); validateRow( response, @@ -2655,8 +2524,8 @@ public void queryWithProgramAndDimensionFilterUsingDataIdSchemeUid() { "Hart", "Mnp3oXrpAbK", "", - "fWI0UiNZgMy", - "3104")); + "3104", + "fWI0UiNZgMy")); } @Test diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tei/TeiAnalyticsController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tei/TeiAnalyticsController.java index 5f5734371f84..17cbdee340f6 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tei/TeiAnalyticsController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tei/TeiAnalyticsController.java @@ -257,7 +257,8 @@ public AnalyticsDimensionsPagingWrapper getQueryDimensions( dimensionMapperService.toDimensionResponse( teiAnalyticsDimensionsService.getQueryDimensionsByTrackedEntityTypeId( trackedEntityType, program), - TeiAnalyticsPrefixStrategy.INSTANCE), + TeiAnalyticsPrefixStrategy.INSTANCE, + true), dimensionsCriteria, fields); } diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionMapperService.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionMapperService.java index a24b00ce8825..6fb1adbafa31 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionMapperService.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionMapperService.java @@ -32,6 +32,11 @@ import java.util.Collection; import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.UnaryOperator; import lombok.RequiredArgsConstructor; import org.hisp.dhis.common.PrefixedDimension; import org.springframework.stereotype.Service; @@ -43,9 +48,28 @@ public class DimensionMapperService { public List toDimensionResponse( Collection dimensions, PrefixStrategy prefixStrategy) { - return mapToList( - dimensions, - pDimension -> toDimensionResponse(pDimension, prefixStrategy.apply(pDimension))); + return toDimensionResponse(dimensions, prefixStrategy, false); + } + + public List toDimensionResponse( + Collection dimensions, PrefixStrategy prefixStrategy, boolean distinct) { + + UnaryOperator> distinctFunction = + distinct ? this::distinctByUid : UnaryOperator.identity(); + + return distinctFunction.apply( + mapToList( + dimensions, + pDimension -> toDimensionResponse(pDimension, prefixStrategy.apply(pDimension)))); + } + + private List distinctByUid(List dimensionResponses) { + return dimensionResponses.stream().filter(distinctBy(DimensionResponse::getUid)).toList(); + } + + private static Predicate distinctBy(Function keyExtractor) { + Set seen = ConcurrentHashMap.newKeySet(); + return t -> seen.add(keyExtractor.apply(t)); } private DimensionResponse toDimensionResponse(PrefixedDimension dimension, String prefix) { @@ -56,6 +80,6 @@ private DimensionResponse toDimensionResponse(PrefixedDimension dimension, Strin .orElseThrow( () -> new IllegalArgumentException( - "Unsupported dimension type: " + getRealClass(dimension))); + "Unsupported dimension type: " + getRealClass(dimension.getItem()))); } } diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/EnrollmentAnalyticsPrefixStrategy.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/EnrollmentAnalyticsPrefixStrategy.java index 8309ea5f59a6..cab79371b42a 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/EnrollmentAnalyticsPrefixStrategy.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/EnrollmentAnalyticsPrefixStrategy.java @@ -36,8 +36,7 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class EnrollmentAnalyticsPrefixStrategy implements PrefixStrategy { - public static final EnrollmentAnalyticsPrefixStrategy INSTANCE = - new EnrollmentAnalyticsPrefixStrategy(); + public static final PrefixStrategy INSTANCE = new EnrollmentAnalyticsPrefixStrategy(); @Override public String apply(PrefixedDimension pDimension) { diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/TeiAnalyticsPrefixStrategy.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/TeiAnalyticsPrefixStrategy.java index b0185245a112..c9a437250768 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/TeiAnalyticsPrefixStrategy.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/TeiAnalyticsPrefixStrategy.java @@ -34,10 +34,10 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class TeiAnalyticsPrefixStrategy implements PrefixStrategy { - public static final TeiAnalyticsPrefixStrategy INSTANCE = new TeiAnalyticsPrefixStrategy(); + public static final PrefixStrategy INSTANCE = EnrollmentAnalyticsPrefixStrategy.INSTANCE; @Override public String apply(PrefixedDimension pDimension) { - return pDimension.getPrefix(); + throw new UnsupportedOperationException("This method should not be called for TEI analytics"); } } diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/mappers/BaseDimensionalItemObjectMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/mappers/BaseDimensionalItemObjectMapper.java index 598a88d9378e..50876892c0ce 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/mappers/BaseDimensionalItemObjectMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/mappers/BaseDimensionalItemObjectMapper.java @@ -59,9 +59,8 @@ public DimensionResponse map(PrefixedDimension prefixedDimension, String prefix) DimensionResponse responseWithDimensionType = super.map(prefixedDimension, prefix) .withDimensionType(dimensionTypeOrElse(prefixedDimension, dimensionItemType.name())); - if (prefixedDimension.getItem() instanceof ValueTypedDimensionalItemObject) { - ValueTypedDimensionalItemObject valueTypedDimensionalItemObject = - (ValueTypedDimensionalItemObject) prefixedDimension.getItem(); + if (prefixedDimension.getItem() + instanceof ValueTypedDimensionalItemObject valueTypedDimensionalItemObject) { return responseWithDimensionType .withValueType(valueTypedDimensionalItemObject.getValueType().name()) .withOptionSet( diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/dimension/DimensionMapperServiceTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/dimension/DimensionMapperServiceTest.java new file mode 100644 index 000000000000..5ec514e47256 --- /dev/null +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/dimension/DimensionMapperServiceTest.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.webapi.dimension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; +import org.hisp.dhis.common.BaseIdentifiableObject; +import org.hisp.dhis.common.DimensionType; +import org.hisp.dhis.common.PrefixedDimension; +import org.hisp.dhis.trackedentity.TrackedEntityAttribute; +import org.hisp.dhis.webapi.dimension.mappers.BaseDimensionalItemObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class DimensionMapperServiceTest { + + private DimensionMapperService dimensionMapperService; + private BaseDimensionMapper baseDimensionMapper; + + @BeforeEach + void setUp() { + baseDimensionMapper = mock(BaseDimensionalItemObjectMapper.class); + dimensionMapperService = new DimensionMapperService(Collections.singleton(baseDimensionMapper)); + } + + @Test + void testReturnedDimensionsHaveNoDuplicates() { + + when(baseDimensionMapper.map(any(), any())) + .thenAnswer( + invocation -> { + PrefixedDimension prefixedDimension = invocation.getArgument(0); + return DimensionResponse.builder().uid(prefixedDimension.getItem().getUid()).build(); + }); + when(baseDimensionMapper.supports(any())).thenReturn(true); + + List dimensionResponse = + dimensionMapperService.toDimensionResponse( + mockDimensions(), EnrollmentAnalyticsPrefixStrategy.INSTANCE, true); + + assertEquals(4, dimensionResponse.size()); + + Collection dimensionResponseUids = + dimensionResponse.stream().map(DimensionResponse::getUid).toList(); + + assertEquals(List.of("uid1", "uid2", "uid3", "repeated"), dimensionResponseUids); + } + + private Collection mockDimensions() { + return Stream.of("uid1", "uid2", "uid3", "repeated", "repeated") + .map(this::asPrefixedDimension) + .toList(); + } + + private PrefixedDimension asPrefixedDimension(String dimension) { + return PrefixedDimension.builder() + .item(buildItem(dimension)) + .dimensionType(DimensionType.PROGRAM_ATTRIBUTE.name()) + .build(); + } + + private BaseIdentifiableObject buildItem(String uid) { + TrackedEntityAttribute item = new TrackedEntityAttribute(); + item.setUid(uid); + return item; + } +} From acaad5a441fd8d03847bd5216587a864934b0578 Mon Sep 17 00:00:00 2001 From: Philip-Larsen-Donnelly <35666657+Philip-Larsen-Donnelly@users.noreply.github.com> Date: Mon, 6 Nov 2023 09:11:37 +0100 Subject: [PATCH 23/63] docs: update feature toggling reference for dashboard-app --- dhis-2/dhis-web/dhis-web-apps/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/dhis-2/dhis-web/dhis-web-apps/README.md b/dhis-2/dhis-web/dhis-web-apps/README.md index 55a3c9fa6c1b..b675593b626c 100644 --- a/dhis-2/dhis-web/dhis-web-apps/README.md +++ b/dhis-2/dhis-web/dhis-web-apps/README.md @@ -10,6 +10,7 @@ The following shows the mapping of app repos to the DHIS2 versions that use the |git@github.com:dhis2/cache-cleaner-app.git|n/a|n/a|2.31|2.32|2.33|2.34|master|master|master|master|master|master| |git@github.com:dhis2/capture-app.git|n/a|n/a|2.31|2.32|2.33|2.34|2.35|2.36|2.37|master|master|master| |git@github.com:dhis2/core-resource-app.git|master|master|2.31|2.32|master|DELETED|DELETED|DELETED|DELETED|DELETED|DELETED|DELETED| +|git@github.com:dhis2/dashboard-app.git|2.29|2.30|2.31|2.32|2.33|2.34|2.35|2.36|2.37|2.38|2.39|master| |git@github.com:dhis2/data-visualizer-app.git|n/a|n/a|v31|32.x|33.x|34.x|35.x|36.x|37.x|38.x|39.x|master| |git@github.com:dhis2/maps-app.git|2.29|2.30|2.31|2.32|2.33|2.34|2.35|2.36|2.37|2.38|2.39|master| |git@github.com:dhis2/messaging-app.git|master|master|master|master|master|master|master|master|master|master|master|master| From 178839d5080a188c97301a46a274795bb0e7b1b6 Mon Sep 17 00:00:00 2001 From: tonsV2 Date: Mon, 6 Nov 2023 17:45:19 +0700 Subject: [PATCH 24/63] ci:update image tag (#15607) * ci: update image tag * ci: compute instance name before stripping hotfix segment * ci: make 'Update IM Play instance' stage the last stage in the pipeline * ci: move stage into stages --- jenkinsfiles/stable | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/jenkinsfiles/stable b/jenkinsfiles/stable index 2d01430353dd..b5ca7d8c9cc5 100644 --- a/jenkinsfiles/stable +++ b/jenkinsfiles/stable @@ -123,12 +123,25 @@ pipeline { } } + stage ('Sync WAR') { + steps { + echo 'Syncing WAR ...' + sh 'curl "https://raw.githubusercontent.com/dhis2/dhis2-server-setup/master/ci/scripts/copy-war-s3.sh" -O' + sh 'chmod +x copy-war-s3.sh' + sh './copy-war-s3.sh stable ${GIT_BRANCH}' + } + } + stage('Update IM Play instance') { + when { + expression { !env.DOCKER_IMAGE_TAG.endsWith("rc") } + } + environment { HTTP = "http --check-status" IM_REPO_URL = "https://github.com/dhis2-sre/im-manager" IM_HOST = "https://api.im.dhis2.org" - INSTANCE_URL = "https://play.im.dhis2.org/stable" + INSTANCE_URL = "https://play.im.dhis2.org" IMAGE_REPOSITORY = "core" IMAGE_PULL_POLICY = "Always" FLYWAY_MIGRATE_OUT_OF_ORDER = "true" @@ -140,9 +153,6 @@ pipeline { } steps { - when { - expression { !env.DOCKER_IMAGE_TAG.endsWith("rc") } - } echo 'Creating DHIS2 instance on IM...' script { withCredentials([usernamePassword(credentialsId: 'dhis2-im-bot', passwordVariable: 'PASSWORD', usernameVariable: 'USER_EMAIL')]) { @@ -153,6 +163,9 @@ pipeline { if (version.startsWith("patch/")) { version = version.split("/")[1] } + env.IMAGE_TAG = version + def instanceName = "stable-${version.replace(".", "-")}" + // If version contains more than 2 dots... It's a hotfix def isHotfix = version.length() - version.replace(".", "").length() > 2 if (isHotfix) { @@ -170,11 +183,10 @@ pipeline { sh '[ -n "$DATABASE_ID" ]' echo "Database: ${env.DATABASE_ID}" - def name = "-${version.replace(".", "-")}" dir('scripts/instances') { - sh "(./findByName.sh play stable${name} && ./restart.sh play stable${name}) || ./deploy-dhis2.sh play stable${name}" + sh "(./findByName.sh play ${instanceName} && ./restart.sh play ${instanceName}) || ./deploy-dhis2.sh play ${instanceName}" timeout(5) { - waitFor.statusOk("${env.INSTANCE_URL}${name}") + waitFor.statusOk("${env.INSTANCE_URL}/${instanceName}") } } } @@ -182,15 +194,6 @@ pipeline { } } } - - stage ('Sync WAR') { - steps { - echo 'Syncing WAR ...' - sh 'curl "https://raw.githubusercontent.com/dhis2/dhis2-server-setup/master/ci/scripts/copy-war-s3.sh" -O' - sh 'chmod +x copy-war-s3.sh' - sh './copy-war-s3.sh stable ${GIT_BRANCH}' - } - } } post { From 41a987f51830f3a4e0c05e98ed6c2b415e454983 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:12:59 +0100 Subject: [PATCH 25/63] chore(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#15612) Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.1...surefire-3.2.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/dhis-test-e2e/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/dhis-test-e2e/pom.xml b/dhis-2/dhis-test-e2e/pom.xml index 46b0b4d6b284..e8803c93fe78 100644 --- a/dhis-2/dhis-test-e2e/pom.xml +++ b/dhis-2/dhis-test-e2e/pom.xml @@ -11,7 +11,7 @@ UTF-8 2.40.0 3.11.0 - 3.2.1 + 3.2.2 1.2.1 5.10.0 2.10.1 From d400d91ca4cc5d2823f6232f91f923d4e2ced709 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:13:10 +0100 Subject: [PATCH 26/63] chore(deps): bump org.junit:junit-bom from 5.10.0 to 5.10.1 in /dhis-2 (#15604) Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.10.0 to 5.10.1. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.0...r5.10.1) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 46b41057a58a..9c72842515d6 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -210,7 +210,7 @@ 1.7.36 - 5.10.0 + 5.10.1 5.2.0 2.0.9 2.2 From a35985ea8c1562bec429714614fa31e4c80be98f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:13:27 +0100 Subject: [PATCH 27/63] chore(deps-dev): bump junit.version in /dhis-2/dhis-test-e2e (#15603) Bumps `junit.version` from 5.10.0 to 5.10.1. Updates `org.junit.jupiter:junit-jupiter` from 5.10.0 to 5.10.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.0...r5.10.1) Updates `org.junit.jupiter:junit-jupiter-params` from 5.10.0 to 5.10.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.0...r5.10.1) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.junit.jupiter:junit-jupiter-params dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/dhis-test-e2e/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/dhis-test-e2e/pom.xml b/dhis-2/dhis-test-e2e/pom.xml index e8803c93fe78..0cd24fdb058a 100644 --- a/dhis-2/dhis-test-e2e/pom.xml +++ b/dhis-2/dhis-test-e2e/pom.xml @@ -13,7 +13,7 @@ 3.11.0 3.2.2 1.2.1 - 5.10.0 + 5.10.1 2.10.1 2.21.1 5.3.2 From 376fc9b874593a9d6a69584bce803a0783e4fe4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Nov 2023 09:13:53 +0100 Subject: [PATCH 28/63] chore(deps): bump com.zaxxer:HikariCP from 5.0.1 to 5.1.0 in /dhis-2 (#15605) Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 5.0.1 to 5.1.0. - [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES) - [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-5.0.1...HikariCP-5.1.0) --- updated-dependencies: - dependency-name: com.zaxxer:HikariCP dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 9c72842515d6..bcd3ccfb6cf1 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -120,7 +120,7 @@ 2.21.1 0.9.5.5 - 5.0.1 + 5.1.0 42.6.0 2.5.1 1.9 From b6648efcc0aa6a13b65c23ed87183c472c88cac8 Mon Sep 17 00:00:00 2001 From: marc Date: Tue, 7 Nov 2023 16:00:16 +0100 Subject: [PATCH 29/63] fix: Validate user authorized when mode ALL in enrollments [TECH-1589] (#15583) * fix: Remove unnecessary capture mode check [TECH-1589] * fix: Add test to validate mode ALL behavior [TECH-1589] * fix: Remove unnecessary test param [TECH-1589] * fix: Validate tracked entity returned in test [TECH-1589] * fix: Validate user authorized when mode ALL in enrollments [TECH-1589] * fix: Add org unit mode in enrollment service tests [TECH-1589] * fix: Add org unit mode in enrollment service tests [TECH-1589] * fix: Add org unit mode in enrollment service tests [TECH-1589] * fix: Validate mode ALL on enrollments old API [TECH-1589] --- .../export/OperationsParamsValidator.java | 2 +- .../enrollment/DefaultEnrollmentService.java | 9 -- .../EnrollmentOperationParamsMapper.java | 3 + .../TrackedEntityOperationParamsMapper.java | 12 +- .../EnrollmentOperationParamsMapperTest.java | 33 ++++- .../OrderAndPaginationExporterTest.java | 9 +- .../enrollment/EnrollmentServiceTest.java | 43 +++++- .../TrackedEntityServiceTest.java | 67 ++++++++- .../ProgramControllerIntegrationTest.java | 8 ++ .../tracker/EnrollmentCriteriaMapper.java | 10 ++ .../tracker/EnrollmentCriteriaMapperTest.java | 128 +++++++++++++++++- 11 files changed, 290 insertions(+), 34 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/OperationsParamsValidator.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/OperationsParamsValidator.java index 2f290a910b59..95b044b91786 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/OperationsParamsValidator.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/OperationsParamsValidator.java @@ -64,7 +64,7 @@ public static void validateOrgUnitMode( private static void validateUserCanSearchOrgUnitModeALL(User user) throws BadRequestException { if (user != null && !(user.isSuper() - || user.isAuthorized(F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS.name()))) { + || user.isAuthorized(F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS))) { throw new BadRequestException( "Current user is not authorized to query across all organisation units"); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java index 6ecdf046ec00..cc21908c3b6d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java @@ -27,7 +27,6 @@ */ package org.hisp.dhis.tracker.export.enrollment; -import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CHILDREN; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.DESCENDANTS; @@ -292,14 +291,6 @@ public void validate(EnrollmentQueryParams params) throws IllegalQueryException throw new IllegalQueryException("Params cannot be null"); } - User user = params.getUser(); - - if (params.isOrganisationUnitMode(ACCESSIBLE) - && (user == null || !user.hasDataViewOrganisationUnitWithFallback())) { - violation = - "Current user must be associated with at least one organisation unit when selection mode is ACCESSIBLE"; - } - if (params.hasProgram() && params.hasTrackedEntityType()) { violation = "Program and tracked entity cannot be specified simultaneously"; } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapper.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapper.java index afeedfbd83a1..84ee815ac6a7 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapper.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapper.java @@ -27,6 +27,8 @@ */ package org.hisp.dhis.tracker.export.enrollment; +import static org.hisp.dhis.tracker.export.OperationsParamsValidator.validateOrgUnitMode; + import java.util.HashSet; import java.util.Set; import lombok.RequiredArgsConstructor; @@ -72,6 +74,7 @@ public EnrollmentQueryParams map(EnrollmentOperationParams operationParams) User user = currentUserService.getCurrentUser(); Set orgUnits = validateOrgUnits(operationParams.getOrgUnitUids(), user); + validateOrgUnitMode(operationParams.getOrgUnitMode(), user, program); EnrollmentQueryParams params = new EnrollmentQueryParams(); params.setProgram(program); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityOperationParamsMapper.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityOperationParamsMapper.java index f7f15b66324e..454573019f8b 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityOperationParamsMapper.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityOperationParamsMapper.java @@ -33,7 +33,6 @@ import java.util.Set; import javax.annotation.Nonnull; import lombok.RequiredArgsConstructor; -import org.hisp.dhis.common.OrganisationUnitSelectionMode; import org.hisp.dhis.common.QueryFilter; import org.hisp.dhis.common.UID; import org.hisp.dhis.feedback.BadRequestException; @@ -76,9 +75,7 @@ public TrackedEntityQueryParams map(TrackedEntityOperationParams operationParams validateTrackedEntityType(operationParams.getTrackedEntityTypeUid()); User user = operationParams.getUser(); - Set orgUnits = - validateOrgUnits( - user, operationParams.getOrganisationUnits(), operationParams.getOrgUnitMode()); + Set orgUnits = validateOrgUnits(user, operationParams.getOrganisationUnits()); TrackedEntityQueryParams params = new TrackedEntityQueryParams(); mapAttributeFilters(params, operationParams.getFilters()); @@ -135,8 +132,7 @@ private void mapAttributeFilters( } } - private Set validateOrgUnits( - User user, Set orgUnitIds, OrganisationUnitSelectionMode orgUnitMode) + private Set validateOrgUnits(User user, Set orgUnitIds) throws BadRequestException, ForbiddenException { Set orgUnits = new HashSet<>(); for (String orgUnitUid : orgUnitIds) { @@ -156,10 +152,6 @@ private Set validateOrgUnits( orgUnits.add(orgUnit); } - if (orgUnitMode == OrganisationUnitSelectionMode.CAPTURE && user != null) { - orgUnits.addAll(user.getOrganisationUnits()); - } - return orgUnits; } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java index 403db5e52553..57b2ad9b24f2 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java @@ -27,6 +27,8 @@ */ package org.hisp.dhis.tracker.export.enrollment; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.SELECTED; import static org.hisp.dhis.utils.Assertions.assertContainsOnly; import static org.hisp.dhis.utils.Assertions.assertIsEmpty; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -118,6 +120,8 @@ void setUp() { orgUnit2.getUid(), user.getTeiSearchOrganisationUnitsWithFallback())) .thenReturn(true); + user.setTeiSearchOrganisationUnits(Set.of(orgUnit1, orgUnit2)); + program = new Program(); program.setUid(PROGRAM_UID); when(programService.getProgram(PROGRAM_UID)).thenReturn(program); @@ -135,7 +139,8 @@ void setUp() { @Test void shouldMapWithoutFetchingNullParamsWhenParamsAreNotSpecified() throws BadRequestException, ForbiddenException { - EnrollmentOperationParams operationParams = EnrollmentOperationParams.EMPTY; + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder().orgUnitMode(ACCESSIBLE).build(); mapper.map(operationParams); @@ -151,10 +156,17 @@ void shouldMapOrgUnitsWhenOrgUnitUidsAreSpecified() EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(ORG_UNIT_1_UID, ORG_UNIT_2_UID)) + .orgUnitMode(SELECTED) .programUid(program.getUid()) .build(); when(trackerAccessManager.canAccess(user, program, orgUnit1)).thenReturn(true); when(trackerAccessManager.canAccess(user, program, orgUnit2)).thenReturn(true); + when(organisationUnitService.isInUserHierarchy( + orgUnit1.getUid(), user.getTeiSearchOrganisationUnitsWithFallback())) + .thenReturn(true); + when(organisationUnitService.isInUserHierarchy( + orgUnit2.getUid(), user.getTeiSearchOrganisationUnitsWithFallback())) + .thenReturn(true); EnrollmentQueryParams params = mapper.map(operationParams); @@ -166,6 +178,7 @@ void shouldThrowExceptionWhenOrgUnitNotFound() { EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of("JW6BrFd0HLu", ORG_UNIT_2_UID)) + .orgUnitMode(SELECTED) .programUid(PROGRAM_UID) .build(); @@ -193,7 +206,7 @@ void shouldThrowExceptionWhenOrgUnitNotInScope() { @Test void shouldMapProgramWhenProgramUidIsSpecified() throws BadRequestException, ForbiddenException { EnrollmentOperationParams requestParams = - EnrollmentOperationParams.builder().programUid(PROGRAM_UID).build(); + EnrollmentOperationParams.builder().programUid(PROGRAM_UID).orgUnitMode(ACCESSIBLE).build(); EnrollmentQueryParams params = mapper.map(requestParams); @@ -214,7 +227,10 @@ void shouldThrowExceptionWhenProgramNotFound() { void shouldMapTrackedEntityTypeWhenTrackedEntityTypeUidIsSpecified() throws BadRequestException, ForbiddenException { EnrollmentOperationParams operationParams = - EnrollmentOperationParams.builder().trackedEntityTypeUid(TRACKED_ENTITY_TYPE_UID).build(); + EnrollmentOperationParams.builder() + .trackedEntityTypeUid(TRACKED_ENTITY_TYPE_UID) + .orgUnitMode(ACCESSIBLE) + .build(); EnrollmentQueryParams params = mapper.map(operationParams); @@ -235,7 +251,10 @@ void shouldThrowExceptionWhenTrackedEntityTypeNotFound() { void shouldMapTrackedEntityWhenTrackedEntityUidIsSpecified() throws BadRequestException, ForbiddenException { EnrollmentOperationParams operationParams = - EnrollmentOperationParams.builder().trackedEntityUid(TRACKED_ENTITY_UID).build(); + EnrollmentOperationParams.builder() + .trackedEntityUid(TRACKED_ENTITY_UID) + .orgUnitMode(ACCESSIBLE) + .build(); EnrollmentQueryParams params = mapper.map(operationParams); @@ -259,6 +278,7 @@ void shouldMapOrderInGivenOrder() throws BadRequestException, ForbiddenException EnrollmentOperationParams.builder() .orderBy("enrollmentDate", SortDirection.ASC) .orderBy("created", SortDirection.DESC) + .orgUnitMode(ACCESSIBLE) .build(); EnrollmentQueryParams params = mapper.map(operationParams); @@ -273,9 +293,10 @@ void shouldMapOrderInGivenOrder() throws BadRequestException, ForbiddenException @Test void shouldMapNullOrderingParamsWhenNoOrderingParamsAreSpecified() throws BadRequestException, ForbiddenException { - EnrollmentOperationParams requestParams = EnrollmentOperationParams.EMPTY; + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder().orgUnitMode(ACCESSIBLE).build(); - EnrollmentQueryParams params = mapper.map(requestParams); + EnrollmentQueryParams params = mapper.map(operationParams); assertIsEmpty(params.getOrder()); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java index 7be8f923fa6b..cfca6375f2df 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java @@ -522,6 +522,7 @@ void shouldReturnPaginatedEnrollmentsGivenNonDefaultPageSize() EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnit.getUid())) + .orgUnitMode(SELECTED) .orderBy("enrollmentDate", SortDirection.ASC) .build(); @@ -553,6 +554,7 @@ void shouldReturnPaginatedEnrollmentsGivenNonDefaultPageSizeAndTotalPages() EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnit.getUid())) + .orgUnitMode(SELECTED) .orderBy("enrollmentDate", SortDirection.ASC) .build(); @@ -590,7 +592,10 @@ void shouldOrderEnrollmentsByPrimaryKeyDescByDefault() .toList(); EnrollmentOperationParams params = - EnrollmentOperationParams.builder().orgUnitUids(Set.of(orgUnit.getUid())).build(); + EnrollmentOperationParams.builder() + .orgUnitUids(Set.of(orgUnit.getUid())) + .orgUnitMode(SELECTED) + .build(); List enrollments = getEnrollments(params); @@ -603,6 +608,7 @@ void shouldOrderEnrollmentsByEnrolledAtAsc() EnrollmentOperationParams params = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnit.getUid())) + .orgUnitMode(SELECTED) .orderBy("enrollmentDate", SortDirection.ASC) .build(); @@ -617,6 +623,7 @@ void shouldOrderEnrollmentsByEnrolledAtDesc() EnrollmentOperationParams params = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnit.getUid())) + .orgUnitMode(SELECTED) .orderBy("enrollmentDate", SortDirection.DESC) .build(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java index e8fbf65b1783..a9b1dbfa1a8a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java @@ -27,7 +27,10 @@ */ package org.hisp.dhis.tracker.export.enrollment; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.SELECTED; import static org.hisp.dhis.tracker.TrackerTestUtils.oneHourAfter; import static org.hisp.dhis.tracker.TrackerTestUtils.oneHourBefore; import static org.hisp.dhis.tracker.TrackerTestUtils.uids; @@ -69,6 +72,7 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -410,7 +414,10 @@ void shouldGetEnrollmentsWhenUserHasReadAccessToProgramAndNoOrgUnitNorOrgUnitMod manager.updateNoAcl(programA); EnrollmentOperationParams params = - EnrollmentOperationParams.builder().programUid(programA.getUid()).build(); + EnrollmentOperationParams.builder() + .programUid(programA.getUid()) + .orgUnitMode(ACCESSIBLE) + .build(); List enrollments = enrollmentService.getEnrollments(params); @@ -447,6 +454,7 @@ void shouldGetEnrollmentWhenEnrollmentsAndOtherParamsAreSpecified() EnrollmentOperationParams.builder() .programUid(programA.getUid()) .enrollmentUids(Set.of(enrollmentA.getUid())) + .orgUnitMode(ACCESSIBLE) .build(); List enrollments = enrollmentService.getEnrollments(params); @@ -464,6 +472,7 @@ void shouldGetEnrollmentsByTrackedEntityWhenUserHasAccessToTrackedEntityType() EnrollmentOperationParams params = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(trackedEntityA.getOrganisationUnit().getUid())) + .orgUnitMode(SELECTED) .trackedEntityUid(trackedEntityA.getUid()) .build(); @@ -485,6 +494,7 @@ void shouldFailGettingEnrollmentsByTrackedEntityWhenUserHasNoAccessToTrackedEnti EnrollmentOperationParams params = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(trackedEntityA.getOrganisationUnit().getUid())) + .orgUnitMode(SELECTED) .trackedEntityUid(trackedEntityA.getUid()) .build(); @@ -501,6 +511,7 @@ void shouldReturnEnrollmentIfEnrollmentWasUpdatedBeforePassedDateAndTime() EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnitA.getUid())) + .orgUnitMode(SELECTED) .lastUpdated(oneHourBeforeLastUpdated) .build(); @@ -517,6 +528,7 @@ void shouldReturnEmptyIfEnrollmentWasUpdatedAfterPassedDateAndTime() EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnitA.getUid())) + .orgUnitMode(SELECTED) .lastUpdated(oneHourAfterLastUpdated) .build(); @@ -534,6 +546,7 @@ void shouldReturnEnrollmentIfEnrollmentStartedBeforePassedDateAndTime() EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnitA.getUid())) + .orgUnitMode(SELECTED) .programUid(programA.getUid()) .programStartDate(oneHourBeforeEnrollmentDate) .build(); @@ -552,6 +565,7 @@ void shouldReturnEmptyIfEnrollmentStartedAfterPassedDateAndTime() EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnitA.getUid())) + .orgUnitMode(SELECTED) .programUid(programA.getUid()) .programStartDate(oneHourAfterEnrollmentDate) .build(); @@ -570,6 +584,7 @@ void shouldReturnEnrollmentIfEnrollmentEndedAfterPassedDateAndTime() EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnitA.getUid())) + .orgUnitMode(SELECTED) .programUid(programA.getUid()) .programEndDate(oneHourAfterEnrollmentDate) .build(); @@ -588,6 +603,7 @@ void shouldReturnEmptyIfEnrollmentEndedBeforePassedDateAndTime() EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() .orgUnitUids(Set.of(orgUnitA.getUid())) + .orgUnitMode(SELECTED) .programUid(programA.getUid()) .programEndDate(oneHourBeforeEnrollmentDate) .build(); @@ -597,6 +613,31 @@ void shouldReturnEmptyIfEnrollmentEndedBeforePassedDateAndTime() assertIsEmpty(enrollments); } + @Test + void shouldFailWhenOrgUnitModeAllAndUserNotAuthorized() { + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder().orgUnitMode(ALL).build(); + + BadRequestException exception = + Assertions.assertThrows( + BadRequestException.class, () -> enrollmentService.getEnrollments(operationParams)); + Assertions.assertEquals( + "Current user is not authorized to query across all organisation units", + exception.getMessage()); + } + + @Test + void shouldReturnAllEnrollmentsWhenOrgUnitModeAllAndUserAuthorized() + throws ForbiddenException, BadRequestException, NotFoundException { + injectSecurityContext(admin); + + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder().orgUnitMode(ALL).build(); + + List enrollments = enrollmentService.getEnrollments(operationParams); + assertContainsOnly(List.of(enrollmentA, enrollmentB, enrollmentChildA), enrollments); + } + private static List attributeUids(Enrollment enrollment) { return enrollment.getTrackedEntity().getTrackedEntityAttributeValues().stream() .map(v -> v.getAttribute().getUid()) diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java index 1bd60004f83f..25ee1f3eb0dc 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.tracker.export.trackedentity; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.DESCENDANTS; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.SELECTED; import static org.hisp.dhis.tracker.TrackerTestUtils.oneHourAfter; @@ -65,6 +66,7 @@ import org.hisp.dhis.common.BaseIdentifiableObject; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.IdentifiableObjectManager; +import org.hisp.dhis.common.IllegalQueryException; import org.hisp.dhis.common.QueryFilter; import org.hisp.dhis.common.QueryOperator; import org.hisp.dhis.common.ValueType; @@ -127,6 +129,8 @@ class TrackedEntityServiceTest extends IntegrationTestBase { private User user; + private User userWithSearchInAllAuthority; + private User admin; private OrganisationUnit orgUnitA; @@ -141,6 +145,8 @@ class TrackedEntityServiceTest extends IntegrationTestBase { private Program programB; + private Program programC; + private Enrollment enrollmentA; private Enrollment enrollmentB; @@ -173,7 +179,6 @@ private static List uids( @Override protected void setUpTest() throws Exception { userService = _userService; - admin = preCreateInjectAdminUser(); orgUnitA = createOrganisationUnit('A'); manager.save(orgUnitA, false); @@ -182,9 +187,23 @@ protected void setUpTest() throws Exception { OrganisationUnit orgUnitC = createOrganisationUnit('C'); manager.save(orgUnitC, false); + admin = preCreateInjectAdminUser(); + admin.setOrganisationUnits(Set.of(orgUnitA, orgUnitB)); + manager.save(admin); + user = createAndAddUser(false, "user", Set.of(orgUnitA), Set.of(orgUnitA), "F_EXPORT_DATA"); user.setTeiSearchOrganisationUnits(Set.of(orgUnitA, orgUnitB, orgUnitC)); + userWithSearchInAllAuthority = + createAndAddUser( + false, + "userSearchInAll", + Set.of(orgUnitA), + Set.of(orgUnitA), + "F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS"); + userWithSearchInAllAuthority.setTeiSearchOrganisationUnits( + Set.of(orgUnitA, orgUnitB, orgUnitC)); + teaA = createTrackedEntityAttribute('A', ValueType.TEXT); manager.save(teaA, false); TrackedEntityAttribute teaB = createTrackedEntityAttribute('B', ValueType.TEXT); @@ -216,6 +235,7 @@ protected void setUpTest() throws Exception { programA.setProgramType(ProgramType.WITH_REGISTRATION); programA.setTrackedEntityType(trackedEntityTypeA); programA.setCategoryCombo(defaultCategoryCombo); + programA.setMinAttributesRequiredToSearch(0); manager.save(programA, false); ProgramStage programStageA1 = createProgramStage(programA); programStageA1.setPublicAccess(AccessStringHelper.FULL); @@ -254,6 +274,14 @@ protected void setUpTest() throws Exception { programB.getSharing().setPublicAccess(AccessStringHelper.FULL); manager.update(programB); + programC = createProgram('C', new HashSet<>(), orgUnitC); + programC.setProgramType(ProgramType.WITH_REGISTRATION); + programC.setTrackedEntityType(trackedEntityTypeA); + programC.setCategoryCombo(defaultCategoryCombo); + programC.setAccessLevel(AccessLevel.PROTECTED); + programC.getSharing().setPublicAccess(AccessStringHelper.READ); + manager.save(programC, false); + programB .getProgramAttributes() .addAll( @@ -1361,6 +1389,43 @@ void shouldReturnTrackedEntityRelationshipsWithTei2Event() () -> assertEquals(eventA.getUid(), actual.getTo().getEvent().getUid())); } + @Test + void shouldFailWhenModeAllUserCanSearchEverywhereButNotSuperuserAndNoAccessToProgram() { + injectSecurityContext(userWithSearchInAllAuthority); + TrackedEntityOperationParams operationParams = + TrackedEntityOperationParams.builder() + .orgUnitMode(ALL) + .programUid(programC.getUid()) + .user(userWithSearchInAllAuthority) + .build(); + + IllegalQueryException ex = + assertThrows( + IllegalQueryException.class, + () -> trackedEntityService.getTrackedEntities(operationParams)); + + assertContains( + String.format( + "Current user is not authorized to read data from selected program: %s", + programC.getUid()), + ex.getMessage()); + } + + @Test + void shouldReturnAllEntitiesWhenSuperuserAndModeAll() + throws ForbiddenException, BadRequestException, NotFoundException { + injectSecurityContext(admin); + TrackedEntityOperationParams operationParams = + TrackedEntityOperationParams.builder() + .orgUnitMode(ALL) + .programUid(programA.getUid()) + .user(admin) + .build(); + + List trackedEntities = trackedEntityService.getTrackedEntities(operationParams); + assertContainsOnly(Set.of(trackedEntityA.getUid()), uids(trackedEntities)); + } + private Set attributeNames(final Collection attributes) { // depends on createTrackedEntityAttribute() prefixing with "Attribute" return attributes.stream() diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/ProgramControllerIntegrationTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/ProgramControllerIntegrationTest.java index 05eddbea937c..ca7de97a65fb 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/ProgramControllerIntegrationTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/ProgramControllerIntegrationTest.java @@ -37,6 +37,8 @@ import org.hisp.dhis.association.jdbc.JdbcOrgUnitAssociationsStore; import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.jsontree.JsonList; +import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.user.User; import org.hisp.dhis.web.HttpStatus; @@ -60,6 +62,8 @@ class ProgramControllerIntegrationTest extends DhisControllerIntegrationTest { @Autowired private ObjectMapper jsonMapper; + @Autowired private OrganisationUnitService orgUnitService; + public static final String PROGRAM_UID = "PrZMWi7rBga"; public static final String ORG_UNIT_UID = "Orgunit1000"; @@ -86,6 +90,10 @@ public void testSetup() throws JsonProcessingException { @Test void testCopyProgramEnrollments() { + OrganisationUnit orgUnit = orgUnitService.getOrganisationUnit(ORG_UNIT_UID); + User user = createAndAddUser(true, "user", Set.of(orgUnit), Set.of(orgUnit)); + injectSecurityContext(user); + assertStatus( HttpStatus.CREATED, POST( diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EnrollmentCriteriaMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EnrollmentCriteriaMapper.java index 46f412461dd5..bebbdec6bac1 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EnrollmentCriteriaMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EnrollmentCriteriaMapper.java @@ -28,7 +28,9 @@ package org.hisp.dhis.webapi.controller.deprecated.tracker; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; +import static org.hisp.dhis.security.Authorities.F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS; import static org.hisp.dhis.webapi.controller.event.mapper.OrderParamsHelper.toOrderParams; import java.util.Date; @@ -145,6 +147,14 @@ public EnrollmentQueryParams getFromUrl( } } + if (ouMode == ALL + && (user != null + && !user.isSuper() + && !user.isAuthorized(F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS))) { + throw new IllegalQueryException( + "Current user is not authorized to query across all organisation units"); + } + Program pr = programUid != null ? programService.getProgram(programUid) : null; if (programUid != null && pr == null) { diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EnrollmentCriteriaMapperTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EnrollmentCriteriaMapperTest.java index df118624a617..d2164f1e1f7b 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EnrollmentCriteriaMapperTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/deprecated/tracker/EnrollmentCriteriaMapperTest.java @@ -28,19 +28,21 @@ package org.hisp.dhis.webapi.controller.deprecated.tracker; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CHILDREN; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.DESCENDANTS; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.SELECTED; +import static org.hisp.dhis.security.Authorities.F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS; import static org.hisp.dhis.utils.Assertions.assertNotEmpty; import static org.hisp.dhis.utils.Assertions.assertStartsWith; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; +import com.google.common.collect.Sets; import java.util.Set; import org.hisp.dhis.common.IllegalQueryException; -import org.hisp.dhis.feedback.ForbiddenException; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.program.EnrollmentQueryParams; @@ -53,6 +55,8 @@ import org.hisp.dhis.trackedentity.TrackedEntityTypeService; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserRole; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -265,7 +269,7 @@ void shouldFailWhenOrgUnitSuppliedAndOrgUnitModeCapture() { } @Test - void shouldMapOrgUnitModeWhenOrgUnitSuppliedAndOrgUnitModeSelected() throws ForbiddenException { + void shouldMapOrgUnitModeWhenOrgUnitSuppliedAndOrgUnitModeSelected() { when(programService.getProgram(PROGRAM_UID)).thenReturn(program); when(organisationUnitService.getOrganisationUnit(ORG_UNIT1)).thenReturn(organisationUnit); when(organisationUnitService.isInUserHierarchy( @@ -298,8 +302,7 @@ void shouldMapOrgUnitModeWhenOrgUnitSuppliedAndOrgUnitModeSelected() throws Forb } @Test - void shouldMapOrgUnitModeWhenOrgUnitSuppliedAndOrgUnitModeDescendants() - throws ForbiddenException { + void shouldMapOrgUnitModeWhenOrgUnitSuppliedAndOrgUnitModeDescendants() { when(programService.getProgram(PROGRAM_UID)).thenReturn(program); when(organisationUnitService.getOrganisationUnit(ORG_UNIT1)).thenReturn(organisationUnit); when(organisationUnitService.isInUserHierarchy( @@ -332,7 +335,7 @@ void shouldMapOrgUnitModeWhenOrgUnitSuppliedAndOrgUnitModeDescendants() } @Test - void shouldMapOrgUnitModeWhenOrgUnitSuppliedAndOrgUnitModeChildren() throws ForbiddenException { + void shouldMapOrgUnitModeWhenOrgUnitSuppliedAndOrgUnitModeChildren() { when(programService.getProgram(PROGRAM_UID)).thenReturn(program); when(organisationUnitService.getOrganisationUnit(ORG_UNIT1)).thenReturn(organisationUnit); when(organisationUnitService.isInUserHierarchy( @@ -363,4 +366,119 @@ void shouldMapOrgUnitModeWhenOrgUnitSuppliedAndOrgUnitModeChildren() throws Forb assertEquals(CHILDREN, enrollmentQueryParams.getOrganisationUnitMode()); } + + @Test + void shouldMapParamsWhenOrgUnitModeAllAndUserIsSuperuser() { + when(programService.getProgram(PROGRAM_UID)).thenReturn(program); + when(organisationUnitService.getOrganisationUnit(ORG_UNIT1)).thenReturn(organisationUnit); + when(trackedEntityTypeService.getTrackedEntityType(ENTITY_TYPE)).thenReturn(trackedEntityType); + when(trackedEntityService.getTrackedEntity(TRACKED_ENTITY)).thenReturn(trackedEntity); + + User superuser = new User(); + UserRole userRole = new UserRole(); + userRole.setAuthorities(Sets.newHashSet("ALL")); + superuser.setUserRoles(Set.of(userRole)); + + when(currentUserService.getCurrentUser()).thenReturn(superuser); + + EnrollmentQueryParams enrollmentQueryParams = + mapper.getFromUrl( + ORG_UNITS, + ALL, + null, + "lastUpdated", + PROGRAM_UID, + ProgramStatus.ACTIVE, + null, + null, + ENTITY_TYPE, + TRACKED_ENTITY, + false, + 1, + 1, + false, + false, + false, + null); + + assertEquals(ALL, enrollmentQueryParams.getOrganisationUnitMode()); + } + + @Test + void shouldMapParamsWhenOrgUnitModeAllAndUserIsAuthorized() { + when(programService.getProgram(PROGRAM_UID)).thenReturn(program); + when(organisationUnitService.getOrganisationUnit(ORG_UNIT1)).thenReturn(organisationUnit); + when(trackedEntityTypeService.getTrackedEntityType(ENTITY_TYPE)).thenReturn(trackedEntityType); + when(trackedEntityService.getTrackedEntity(TRACKED_ENTITY)).thenReturn(trackedEntity); + + User superuser = new User(); + UserRole userRole = new UserRole(); + userRole.setAuthorities(Sets.newHashSet("ALL")); + superuser.setUserRoles(Set.of(userRole)); + + when(currentUserService.getCurrentUser()).thenReturn(superuser); + + EnrollmentQueryParams enrollmentQueryParams = + mapper.getFromUrl( + ORG_UNITS, + ALL, + null, + "lastUpdated", + PROGRAM_UID, + ProgramStatus.ACTIVE, + null, + null, + ENTITY_TYPE, + TRACKED_ENTITY, + false, + 1, + 1, + false, + false, + false, + null); + + assertEquals(ALL, enrollmentQueryParams.getOrganisationUnitMode()); + } + + @Test + void shouldFailWhenOrgUnitModeAllAndUserNotAuthorized() { + when(organisationUnitService.getOrganisationUnit(ORG_UNIT1)).thenReturn(organisationUnit); + when(organisationUnitService.isInUserHierarchy( + organisationUnit.getUid(), user.getTeiSearchOrganisationUnitsWithFallback())) + .thenReturn(true); + + User superuser = new User(); + UserRole userRole = new UserRole(); + userRole.setAuthorities( + Sets.newHashSet(F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS.name())); + superuser.setUserRoles(Set.of(userRole)); + + IllegalQueryException exception = + Assertions.assertThrows( + IllegalQueryException.class, + () -> + mapper.getFromUrl( + ORG_UNITS, + ALL, + null, + "lastUpdated", + PROGRAM_UID, + ProgramStatus.ACTIVE, + null, + null, + ENTITY_TYPE, + TRACKED_ENTITY, + false, + 1, + 1, + false, + false, + false, + null)); + + Assertions.assertEquals( + "Current user is not authorized to query across all organisation units", + exception.getMessage()); + } } From 367fde4e2783644fd52ede58b51df41eb3728b5e Mon Sep 17 00:00:00 2001 From: Morten Hansen Date: Wed, 8 Nov 2023 09:03:47 +0700 Subject: [PATCH 30/63] fix: handle versions in subpaths (#15614) --- .../org/hisp/dhis/webapi/controller/RouteController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/RouteController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/RouteController.java index 31ff7b804c62..9445d792e8b7 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/RouteController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/RouteController.java @@ -91,9 +91,13 @@ public ResponseEntity runWithSubpath( private Optional getSubPath(String path, String id) { String prefix = String.format("%s/%s/run/", RouteSchemaDescriptor.API_ENDPOINT, id); - if (path.startsWith(prefix)) { + + if (path.startsWith(prefix, 3)) { + return Optional.of(path.substring(prefix.length() + 3)); + } else if (path.startsWith(prefix)) { return Optional.of(path.substring(prefix.length())); } + return Optional.empty(); } } From 53cda5d25a750b4e364b2696c89fdbb55d36ac62 Mon Sep 17 00:00:00 2001 From: Jan Bernitt Date: Wed, 8 Nov 2023 04:38:02 +0100 Subject: [PATCH 31/63] fix: always flush the batch handler for CompleteDataSet import [DHIS2-15362] (#15618) * fix: always flush the batch handler for CompleteDataSet import [DHIS2-15362] * chore: removed unused parameter and method overloads [DHIS2-15362] --- ...eteDataSetRegistrationExchangeService.java | 24 ------- ...eteDataSetRegistrationExchangeService.java | 69 ++++++++++--------- ...ImportCompleteDataSetRegistrationsJob.java | 8 +-- 3 files changed, 38 insertions(+), 63 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/CompleteDataSetRegistrationExchangeService.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/CompleteDataSetRegistrationExchangeService.java index 1b74aa20a637..01fdfa18025c 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/CompleteDataSetRegistrationExchangeService.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/CompleteDataSetRegistrationExchangeService.java @@ -34,7 +34,6 @@ import org.hisp.dhis.common.IdSchemes; import org.hisp.dhis.dxf2.common.ImportOptions; import org.hisp.dhis.dxf2.importsummary.ImportSummary; -import org.hisp.dhis.scheduling.JobConfiguration; /** * Import/export service for {@link CompleteDataSetRegistration data set completion registrations}. @@ -109,17 +108,6 @@ void writeCompleteDataSetRegistrationsJson( */ ImportSummary saveCompleteDataSetRegistrationsXml(InputStream in, ImportOptions importOptions); - /** - * Imports {@link CompleteDataSetRegistrations} from an XML payload. - * - * @param in the stream providing the XML payload. - * @param importOptions the options for the import. - * @param jobId the task (optional). - * @return a summary of the import process. - */ - ImportSummary saveCompleteDataSetRegistrationsXml( - InputStream in, ImportOptions importOptions, JobConfiguration jobId); - /** * Imports {@link CompleteDataSetRegistrations} from a JSON payload. * @@ -129,22 +117,10 @@ ImportSummary saveCompleteDataSetRegistrationsXml( */ ImportSummary saveCompleteDataSetRegistrationsJson(InputStream in, ImportOptions importOptions); - /** - * Imports {@link CompleteDataSetRegistrations} from a JSON payload. - * - * @param in the stream providing the XML payload. - * @param importOptions the options for the import. - * @param jobId the task (optional). - * @return a summary of the import process. - */ - ImportSummary saveCompleteDataSetRegistrationsJson( - InputStream in, ImportOptions importOptions, JobConfiguration jobId); - /** * Validates the given {@link ExportParams}. * * @param params the export parameters. - * @throws IllegalQueryException if validation failed. */ void validate(ExportParams params); } diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/DefaultCompleteDataSetRegistrationExchangeService.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/DefaultCompleteDataSetRegistrationExchangeService.java index 8c473a11d2d7..a14e523ecd6b 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/DefaultCompleteDataSetRegistrationExchangeService.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/DefaultCompleteDataSetRegistrationExchangeService.java @@ -28,12 +28,14 @@ package org.hisp.dhis.dxf2.dataset; import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Set; +import java.util.concurrent.Callable; import javax.annotation.Nonnull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -76,7 +78,6 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodService; import org.hisp.dhis.period.PeriodType; -import org.hisp.dhis.scheduling.JobConfiguration; import org.hisp.dhis.setting.SystemSettingManager; import org.hisp.dhis.system.util.Clock; import org.hisp.dhis.system.util.ValidationUtils; @@ -223,47 +224,50 @@ public void writeCompleteDataSetRegistrationsJson( @Transactional public ImportSummary saveCompleteDataSetRegistrationsXml( InputStream in, ImportOptions importOptions) { - return saveCompleteDataSetRegistrationsXml(in, importOptions, null); + return saveCompleteDataSetRegistrations(importOptions, () -> readRegistrationsFromXml(in)); } - @Override - @Transactional - public ImportSummary saveCompleteDataSetRegistrationsXml( - InputStream in, ImportOptions importOptions, JobConfiguration jobId) { - try { - in = StreamUtils.wrapAndCheckCompressionFormat(in); - CompleteDataSetRegistrations completeDataSetRegistrations = - new StreamingXmlCompleteDataSetRegistrations(XMLFactory.getXMLReader(in)); - - return saveCompleteDataSetRegistrations(importOptions, completeDataSetRegistrations); - } catch (Exception ex) { - return handleImportError(ex); - } + @Nonnull + private static CompleteDataSetRegistrations readRegistrationsFromXml(InputStream in) + throws IOException { + in = StreamUtils.wrapAndCheckCompressionFormat(in); + return new StreamingXmlCompleteDataSetRegistrations(XMLFactory.getXMLReader(in)); } @Override @Transactional public ImportSummary saveCompleteDataSetRegistrationsJson( InputStream in, ImportOptions importOptions) { - return saveCompleteDataSetRegistrationsJson(in, importOptions, null); + return saveCompleteDataSetRegistrations(importOptions, () -> readRegistrationsFromJson(in)); } - @Override - @Transactional - public ImportSummary saveCompleteDataSetRegistrationsJson( - InputStream in, ImportOptions importOptions, JobConfiguration jobId) { + private ImportSummary saveCompleteDataSetRegistrations( + ImportOptions importOptions, + Callable deserializeRegistrations) { + BatchHandler batchHandler = + batchHandlerFactory.createBatchHandler(CompleteDataSetRegistrationBatchHandler.class); try { - in = StreamUtils.wrapAndCheckCompressionFormat(in); + CompleteDataSetRegistrations completeDataSetRegistrations = deserializeRegistrations.call(); + ImportSummary summary = + saveCompleteDataSetRegistrations( + importOptions, completeDataSetRegistrations, batchHandler); - CompleteDataSetRegistrations completeDataSetRegistrations = - jsonMapper.readValue(in, CompleteDataSetRegistrations.class); + batchHandler.flush(); - return saveCompleteDataSetRegistrations(importOptions, completeDataSetRegistrations); + return summary; } catch (Exception ex) { + batchHandler.flush(); return handleImportError(ex); } } + @Nonnull + private CompleteDataSetRegistrations readRegistrationsFromJson(InputStream in) + throws IOException { + in = StreamUtils.wrapAndCheckCompressionFormat(in); + return jsonMapper.readValue(in, CompleteDataSetRegistrations.class); + } + @Override public void validate(ExportParams params) throws IllegalQueryException { ErrorMessage error = null; @@ -367,7 +371,9 @@ private ImportSummary handleImportError(Throwable ex) { } private ImportSummary saveCompleteDataSetRegistrations( - ImportOptions importOptions, CompleteDataSetRegistrations completeRegistrations) { + ImportOptions importOptions, + CompleteDataSetRegistrations completeRegistrations, + BatchHandler batchHandler) { Clock clock = new Clock(log).startClock().logTime("Starting complete data set registration import"); @@ -406,7 +412,8 @@ private ImportSummary saveCompleteDataSetRegistrations( // --------------------------------------------------------------------- int totalCount = - batchImport(completeRegistrations, cfg, importSummary, metaDataCallables, caches); + batchImport( + completeRegistrations, cfg, importSummary, metaDataCallables, caches, batchHandler); ImportCount count = importSummary.getImportCount(); @@ -428,16 +435,14 @@ private int batchImport( ImportConfig config, ImportSummary summary, MetadataCallables mdCallables, - MetadataCaches mdCaches) { + MetadataCaches mdCaches, + BatchHandler batchHandler) { final User currentUser = currentUserService.getCurrentUser(); final String currentUserName = currentUser.getUsername(); final Set userOrgUnits = currentUserService.getCurrentUserOrganisationUnits(); final I18n i18n = i18nManager.getI18n(); - BatchHandler batchHandler = - batchHandlerFactory - .createBatchHandler(CompleteDataSetRegistrationBatchHandler.class) - .init(); + batchHandler.init(); int importCount = 0, updateCount = 0, deleteCount = 0, totalCount = 0; @@ -607,8 +612,6 @@ private int batchImport( } } - batchHandler.flush(); - finalizeSummary(summary, totalCount, importCount, updateCount, deleteCount); return totalCount; diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/tasks/ImportCompleteDataSetRegistrationsJob.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/tasks/ImportCompleteDataSetRegistrationsJob.java index e6c115500eb5..70687f824327 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/tasks/ImportCompleteDataSetRegistrationsJob.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/dataset/tasks/ImportCompleteDataSetRegistrationsJob.java @@ -78,13 +78,9 @@ public void execute(JobConfiguration jobConfig, JobProgress progress) { ImportSummary summary = switch (contentType) { case "application/json" -> progress.runStage( - () -> - registrationService.saveCompleteDataSetRegistrationsJson( - input, options, jobConfig)); + () -> registrationService.saveCompleteDataSetRegistrationsJson(input, options)); case "application/xml" -> progress.runStage( - () -> - registrationService.saveCompleteDataSetRegistrationsXml( - input, options, jobConfig)); + () -> registrationService.saveCompleteDataSetRegistrationsXml(input, options)); default -> { progress.failedStage("Unknown format: " + contentType); yield null; From 46d6ca101ba8a15a8f958f7ea7e72e92f127de8b Mon Sep 17 00:00:00 2001 From: marc Date: Wed, 8 Nov 2023 08:04:08 +0100 Subject: [PATCH 32/63] fix: Remove org unit in user scope from flaky test [DHIS2-16130] (#15619) --- .../export/enrollment/EnrollmentOperationParamsMapperTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java index 57b2ad9b24f2..963676a78bde 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java @@ -177,7 +177,7 @@ void shouldMapOrgUnitsWhenOrgUnitUidsAreSpecified() void shouldThrowExceptionWhenOrgUnitNotFound() { EnrollmentOperationParams operationParams = EnrollmentOperationParams.builder() - .orgUnitUids(Set.of("JW6BrFd0HLu", ORG_UNIT_2_UID)) + .orgUnitUids(Set.of("JW6BrFd0HLu")) .orgUnitMode(SELECTED) .programUid(PROGRAM_UID) .build(); From 6a47df808dd58286e66c0077c3a2e18eb5bde0cc Mon Sep 17 00:00:00 2001 From: Enrico Colasante Date: Wed, 8 Nov 2023 09:04:51 +0100 Subject: [PATCH 33/63] chore: Rename dueDate to scheduledDate in service layer [TECH-1615] (#15617) * chore: Rename dueDate to scheduledDate in service layer [TECH-1615] * fix: Remove org unit in user scope from flaky test [DHIS2-16130] * Fix tests * Fix tests --------- Co-authored-by: muilpp --- .../java/org/hisp/dhis/program/Event.java | 10 ++++----- .../comparator/EventVisitDateComparator.java | 6 +++-- ...ogramStageNotificationMessageRenderer.java | 6 ++--- .../program/DefaultEnrollmentService.java | 2 +- .../dhis/program/DefaultEventService.java | 2 +- .../hibernate/HibernateEventStore.java | 4 ++-- .../dhis/sms/listener/CommandSMSListener.java | 2 +- .../sms/listener/CompressionSMSListener.java | 2 +- .../hisp/dhis/program/hibernate/Event.hbm.xml | 2 +- ...TrackerNotificationWebHookServiceTest.java | 2 +- .../tracker/event/AbstractEventService.java | 5 +++-- .../tracker/event/JdbcEventStore.java | 4 ++-- .../context/ProgramStageInstanceSupplier.java | 2 +- .../mapper/ProgramStageInstanceMapper.java | 4 ++-- ...DefaultProgramRuleEntityMapperService.java | 7 +++--- .../ProgramRuleEntityMapperServiceTest.java | 4 ++-- .../export/event/DefaultEventService.java | 2 +- .../event/EventOperationParamsMapper.java | 4 ++-- .../export/event/EventQueryParams.java | 4 ++-- .../tracker/export/event/JdbcEventStore.java | 4 ++-- .../mapper/EventRowCallbackHandler.java | 2 +- .../EventTrackerConverterService.java | 8 +++---- .../imports/preheat/mappers/EventMapper.java | 2 +- .../event/EventOperationParamsMapperTest.java | 4 ++-- .../EventTrackerConverterServiceTest.java | 2 +- .../event/data/EventAnalyticsServiceTest.java | 22 +++++++++---------- .../deprecated/tracker/EventImportTest.java | 2 +- ...RelationshipsTrackedEntityServiceTest.java | 2 +- .../maintenance/MaintenanceServiceTest.java | 4 ++-- ...rogramNotificationMessageRendererTest.java | 2 +- .../hisp/dhis/program/EventServiceTest.java | 12 +++++----- .../org/hisp/dhis/program/EventStoreTest.java | 16 +++++++------- .../dhis/program/ProgramMessageStoreTest.java | 2 +- .../engine/ProgramRuleEngineTest.java | 10 ++++----- .../TrackerAccessManagerTest.java | 2 +- .../OrderAndPaginationExporterTest.java | 2 +- .../export/event/EventExporterTest.java | 5 +++-- .../TrackedEntityServiceTest.java | 4 ++-- .../tracker/export/event/EventMapper.java | 4 ++-- .../relationship/RelationshipItemMapper.java | 2 +- .../event/EventRequestParamsMapperTest.java | 2 +- 41 files changed, 97 insertions(+), 92 deletions(-) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Event.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Event.java index 57c3eeccddf8..c718267e694f 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Event.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Event.java @@ -72,7 +72,7 @@ public class Event extends SoftDeletableObject { private UserInfoSnapshot lastUpdatedByUserInfo; - private Date dueDate; + private Date scheduledDate; private Date occurredDate; @@ -216,12 +216,12 @@ public void setCompletedBy(String completedBy) { @JsonProperty @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) - public Date getDueDate() { - return dueDate; + public Date getScheduledDate() { + return scheduledDate; } - public void setDueDate(Date dueDate) { - this.dueDate = dueDate; + public void setScheduledDate(Date scheduledDate) { + this.scheduledDate = scheduledDate; } @JsonProperty("eventDate") diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/comparator/EventVisitDateComparator.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/comparator/EventVisitDateComparator.java index 5d9ba5f5a8d8..826cdde4ff2a 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/comparator/EventVisitDateComparator.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/comparator/EventVisitDateComparator.java @@ -37,8 +37,10 @@ public class EventVisitDateComparator implements Comparator { @Override public int compare(Event event1, Event event2) { - Date d1 = (event1.getOccurredDate() != null) ? event1.getOccurredDate() : event1.getDueDate(); - Date d2 = (event2.getOccurredDate() != null) ? event2.getOccurredDate() : event2.getDueDate(); + Date d1 = + (event1.getOccurredDate() != null) ? event1.getOccurredDate() : event1.getScheduledDate(); + Date d2 = + (event2.getOccurredDate() != null) ? event2.getOccurredDate() : event2.getScheduledDate(); if (d1.before(d2)) { return -1; } else if (d1.after(d2)) { diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/notification/ProgramStageNotificationMessageRenderer.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/notification/ProgramStageNotificationMessageRenderer.java index 552664b4c19e..e718f724e5d3 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/notification/ProgramStageNotificationMessageRenderer.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/notification/ProgramStageNotificationMessageRenderer.java @@ -66,15 +66,15 @@ public class ProgramStageNotificationMessageRenderer .put( ProgramStageTemplateVariable.ORG_UNIT_CODE, event -> event.getOrganisationUnit().getCode()) - .put(ProgramStageTemplateVariable.DUE_DATE, event -> formatDate(event.getDueDate())) + .put(ProgramStageTemplateVariable.DUE_DATE, event -> formatDate(event.getScheduledDate())) .put( ProgramStageTemplateVariable.EVENT_DATE, event -> formatDate(event.getOccurredDate())) .put( ProgramStageTemplateVariable.DAYS_SINCE_DUE_DATE, - event -> daysSince(event.getDueDate())) + event -> daysSince(event.getScheduledDate())) .put( ProgramStageTemplateVariable.DAYS_UNTIL_DUE_DATE, - event -> daysUntil(event.getDueDate())) + event -> daysUntil(event.getScheduledDate())) .put(ProgramStageTemplateVariable.CURRENT_DATE, event -> formatDate(new Date())) .put( ProgramStageTemplateVariable.EVENT_ORG_UNIT_ID, diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java index 1601a698bce6..672459e49f49 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java @@ -472,7 +472,7 @@ public void cancelEnrollmentStatus(Enrollment enrollment) { // Set status as skipped for overdue events, or delete // ------------------------------------------------------------- - if (event.getDueDate().before(enrollment.getEndDate())) { + if (event.getScheduledDate().before(enrollment.getEndDate())) { event.setStatus(EventStatus.SKIPPED); eventStore.update(event); } else { diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEventService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEventService.java index c20cb0dc42a1..f655219917e9 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEventService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEventService.java @@ -179,7 +179,7 @@ public Event createEvent( event.setEnrollment(enrollment); event.setProgramStage(programStage); event.setOrganisationUnit(organisationUnit); - event.setDueDate(dueDate); + event.setScheduledDate(dueDate); event.setStatus(EventStatus.SCHEDULE); if (programStage.getOpenAfterEnrollment() diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/hibernate/HibernateEventStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/hibernate/HibernateEventStore.java index 13729673fe28..e6296fa64f0d 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/hibernate/HibernateEventStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/hibernate/HibernateEventStore.java @@ -209,10 +209,10 @@ public List getWithScheduledNotifications( "select distinct ev from Event as ev " + "inner join ev.programStage as ps " + "where :notificationTemplate in elements(ps.notificationTemplates) " - + "and ev.dueDate is not null " + + "and ev.scheduledDate is not null " + "and ev.occurredDate is null " + "and ev.status != :skippedEventStatus " - + "and cast(:targetDate as date) = ev.dueDate " + + "and cast(:targetDate as date) = ev.scheduledDate " + "and ev.deleted is false"; return getQuery(hql) diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CommandSMSListener.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CommandSMSListener.java index 7e82601e54e8..ac6185408ada 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CommandSMSListener.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CommandSMSListener.java @@ -249,7 +249,7 @@ protected void register( event.setProgramStage(smsCommand.getProgramStage()); event.setEnrollment(enrollment); event.setOccurredDate(sms.getSentDate()); - event.setDueDate(sms.getSentDate()); + event.setScheduledDate(sms.getSentDate()); event.setAttributeOptionCombo(dataElementCategoryService.getDefaultCategoryOptionCombo()); event.setCompletedBy("DHIS 2"); event.setStoredBy(currentUserInfo.getUsername()); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CompressionSMSListener.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CompressionSMSListener.java index e6cc1a1978d7..a223840fc632 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CompressionSMSListener.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/sms/listener/CompressionSMSListener.java @@ -270,7 +270,7 @@ protected List saveNewEvent( event.setProgramStage(programStage); event.setEnrollment(enrollment); event.setOccurredDate(eventDate); - event.setDueDate(dueDate); + event.setScheduledDate(dueDate); event.setAttributeOptionCombo(aoc); event.setStoredBy(user.getUsername()); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml index 2945f926063a..67e24a8085a4 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml +++ b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml @@ -44,7 +44,7 @@ - + diff --git a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/notification/TrackerNotificationWebHookServiceTest.java b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/notification/TrackerNotificationWebHookServiceTest.java index 1178c02c21a0..4e11768f6bde 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/notification/TrackerNotificationWebHookServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/notification/TrackerNotificationWebHookServiceTest.java @@ -148,7 +148,7 @@ public void initTest() { event.setOrganisationUnit(organisationUnitA); enrollment.setEnrollmentDate(new Date()); event.setOccurredDate(new Date()); - event.setDueDate(new Date()); + event.setScheduledDate(new Date()); event.setEnrollment(enrollment); dataValue = new EventDataValue(); diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java index 9003dd1649c9..eebe10bb4086 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java @@ -596,7 +596,7 @@ public org.hisp.dhis.dxf2.deprecated.tracker.event.Event getEvent( EnrollmentStatus.fromProgramStatus(programStageInstance.getEnrollment().getStatus())); event.setStatus(programStageInstance.getStatus()); event.setEventDate(DateUtils.getIso8601NoTz(programStageInstance.getOccurredDate())); - event.setDueDate(DateUtils.getIso8601NoTz(programStageInstance.getDueDate())); + event.setDueDate(DateUtils.getIso8601NoTz(programStageInstance.getScheduledDate())); event.setStoredBy(programStageInstance.getStoredBy()); event.setCompletedBy(programStageInstance.getCompletedBy()); event.setCompletedDate(DateUtils.getIso8601NoTz(programStageInstance.getCompletedDate())); @@ -806,7 +806,8 @@ public void updateEventForEventDate(org.hisp.dhis.dxf2.deprecated.tracker.event. executionDate = DateUtils.parseDate(event.getEventDate()); } - Date eventDate = executionDate != null ? executionDate : programStageInstance.getDueDate(); + Date eventDate = + executionDate != null ? executionDate : programStageInstance.getScheduledDate(); validateAttributeOptionComboDate(programStageInstance.getAttributeOptionCombo(), eventDate); diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java index a25bc0f2c7f9..ea762db34bf8 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java @@ -1947,7 +1947,7 @@ private void bindEventParamsForInsert(PreparedStatement ps, Event event) throws SQLException, JsonProcessingException { ps.setLong(1, event.getEnrollment().getId()); ps.setLong(2, event.getProgramStage().getId()); - ps.setTimestamp(3, JdbcEventSupport.toTimestamp(event.getDueDate())); + ps.setTimestamp(3, JdbcEventSupport.toTimestamp(event.getScheduledDate())); ps.setTimestamp(4, JdbcEventSupport.toTimestamp(event.getOccurredDate())); ps.setLong(5, event.getOrganisationUnit().getId()); ps.setString(6, event.getStatus().toString()); @@ -1980,7 +1980,7 @@ private MapSqlParameterSource getSqlParametersForUpdate(org.hisp.dhis.program.Ev .addValue("programstageid", event.getProgramStage().getId()) .addValue( EventQuery.COLUMNS.DUE_DATE.getColumnName(), - JdbcEventSupport.toTimestamp(event.getDueDate())) + JdbcEventSupport.toTimestamp(event.getScheduledDate())) .addValue( EventQuery.COLUMNS.EXECUTION_DATE.getColumnName(), JdbcEventSupport.toTimestamp(event.getOccurredDate())) diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java index f1594cf220fc..fc972b0bedca 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java @@ -116,7 +116,7 @@ public Map get( psi.setDeleted(rs.getBoolean("deleted")); psi.setProgramStage(getProgramStage(importOptions, rs.getLong("programstageid"))); psi.setOrganisationUnit(getOu(rs)); - psi.setDueDate(rs.getTimestamp("duedate")); + psi.setScheduledDate(rs.getTimestamp("duedate")); psi.setOccurredDate(rs.getTimestamp("executiondate")); psi.setCompletedDate(rs.getTimestamp("completeddate")); psi.setAttributeOptionCombo(getCatOptionCombo(rs)); diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/mapper/ProgramStageInstanceMapper.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/mapper/ProgramStageInstanceMapper.java index b626feb1dd3d..c41cca2f30f3 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/mapper/ProgramStageInstanceMapper.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/mapper/ProgramStageInstanceMapper.java @@ -119,7 +119,7 @@ private Event mapForUpdate(org.hisp.dhis.dxf2.deprecated.tracker.event.Event eve psi.setEventDataValues(workContext.getEventDataValueMap().get(event.getUid())); if (event.getDueDate() != null) { - psi.setDueDate(parseDate(event.getDueDate())); + psi.setScheduledDate(parseDate(event.getDueDate())); } setExecutionDate(event, psi); @@ -182,7 +182,7 @@ public Event mapForInsert(org.hisp.dhis.dxf2.deprecated.tracker.event.Event even dueDate = parseDate(event.getDueDate()); } - psi.setDueDate(dueDate); + psi.setScheduledDate(dueDate); setCompletedDate(event, psi); // Note that execution date can be null setExecutionDate(event, psi); diff --git a/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java b/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java index 50e647b949e5..e62b9d711bce 100644 --- a/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java +++ b/dhis-2/dhis-services/dhis-service-program-rule/src/main/java/org/hisp/dhis/programrule/engine/DefaultProgramRuleEntityMapperService.java @@ -438,8 +438,9 @@ public RuleEvent toMappedRuleEvent(Event eventToEvaluate) { eventToEvaluate.getUid(), eventToEvaluate.getProgramStage().getUid(), RuleEvent.Status.valueOf(eventToEvaluate.getStatus().toString()), - ObjectUtils.defaultIfNull(eventToEvaluate.getOccurredDate(), eventToEvaluate.getDueDate()), - eventToEvaluate.getDueDate(), + ObjectUtils.defaultIfNull( + eventToEvaluate.getOccurredDate(), eventToEvaluate.getScheduledDate()), + eventToEvaluate.getScheduledDate(), orgUnit, orgUnitCode, eventToEvaluate.getEventDataValues().stream() @@ -449,7 +450,7 @@ public RuleEvent toMappedRuleEvent(Event eventToEvaluate) { dv -> RuleDataValue.create( ObjectUtils.defaultIfNull( - eventToEvaluate.getOccurredDate(), eventToEvaluate.getDueDate()), + eventToEvaluate.getOccurredDate(), eventToEvaluate.getScheduledDate()), eventToEvaluate.getProgramStage().getUid(), dv.getDataElement(), dv.getValue())) diff --git a/dhis-2/dhis-services/dhis-service-program-rule/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEntityMapperServiceTest.java b/dhis-2/dhis-services/dhis-service-program-rule/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEntityMapperServiceTest.java index b9f536adee0f..2e8597e30e01 100644 --- a/dhis-2/dhis-services/dhis-service-program-rule/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEntityMapperServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-program-rule/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEntityMapperServiceTest.java @@ -474,13 +474,13 @@ private void setUpProgramRules() { eventA.setOrganisationUnit(organisationUnit); eventA.setAutoFields(); - eventA.setDueDate(new Date()); + eventA.setScheduledDate(new Date()); eventA.setOccurredDate(new Date()); eventA.setEventDataValues(Sets.newHashSet(eventDataValueA)); eventB.setOrganisationUnit(organisationUnit); eventB.setAutoFields(); - eventB.setDueDate(new Date()); + eventB.setScheduledDate(new Date()); eventB.setOccurredDate(new Date()); eventB.setEventDataValues(Sets.newHashSet(eventDataValueB)); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/DefaultEventService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/DefaultEventService.java index 36894ecdd66f..9e730e4c3990 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/DefaultEventService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/DefaultEventService.java @@ -95,7 +95,7 @@ public Event getEvent(@Nonnull Event event, EventParams eventParams) throws Forb result.setStatus(event.getStatus()); result.setOccurredDate(event.getOccurredDate()); - result.setDueDate(event.getDueDate()); + result.setScheduledDate(event.getScheduledDate()); result.setStoredBy(event.getStoredBy()); result.setCompletedBy(event.getCompletedBy()); result.setCompletedDate(event.getCompletedDate()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java index 26bbadebbfe8..5b6f0313c67d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java @@ -129,8 +129,8 @@ public EventQueryParams map(EventOperationParams operationParams) operationParams.getAssignedUserMode(), user, operationParams.getAssignedUsers())) .setOccurredStartDate(operationParams.getOccurredAfter()) .setOccurredEndDate(operationParams.getOccurredBefore()) - .setScheduleAtStartDate(operationParams.getScheduledAfter()) - .setScheduleAtEndDate(operationParams.getScheduledBefore()) + .setScheduledStartDate(operationParams.getScheduledAfter()) + .setScheduledEndDate(operationParams.getScheduledBefore()) .setUpdatedAtStartDate(operationParams.getUpdatedAfter()) .setUpdatedAtEndDate(operationParams.getUpdatedBefore()) .setUpdatedAtDuration(operationParams.getUpdatedWithin()) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQueryParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQueryParams.java index 3cfc396499b0..b1561121d31b 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQueryParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQueryParams.java @@ -325,7 +325,7 @@ public Date getScheduleAtStartDate() { return scheduleAtStartDate; } - public EventQueryParams setScheduleAtStartDate(Date scheduleAtStartDate) { + public EventQueryParams setScheduledStartDate(Date scheduleAtStartDate) { this.scheduleAtStartDate = scheduleAtStartDate; return this; } @@ -334,7 +334,7 @@ public Date getScheduleAtEndDate() { return scheduleAtEndDate; } - public EventQueryParams setScheduleAtEndDate(Date scheduleAtEndDate) { + public EventQueryParams setScheduledEndDate(Date scheduleAtEndDate) { this.scheduleAtEndDate = scheduleAtEndDate; return this; } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java index 4874c2eae089..0650e9f9ba25 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java @@ -201,7 +201,7 @@ class JdbcEventStore implements EventStore { entry("occurredDate", COLUMN_EVENT_EXECUTION_DATE), entry("enrollment.followUp", COLUMN_ENROLLMENT_FOLLOWUP), entry("status", COLUMN_EVENT_STATUS), - entry("dueDate", COLUMN_EVENT_DUE_DATE), + entry("scheduledDate", COLUMN_EVENT_DUE_DATE), entry("storedBy", COLUMN_EVENT_STORED_BY), entry("lastUpdatedBy", COLUMN_EVENT_LAST_UPDATED_BY), entry("createdBy", COLUMN_EVENT_CREATED_BY), @@ -326,7 +326,7 @@ private List fetchEvents(EventQueryParams queryParams, PageParams pagePar event.setAttributeOptionCombo(coc); event.setStoredBy(resultSet.getString(COLUMN_EVENT_STORED_BY)); - event.setDueDate(resultSet.getTimestamp(COLUMN_EVENT_DUE_DATE)); + event.setScheduledDate(resultSet.getTimestamp(COLUMN_EVENT_DUE_DATE)); event.setOccurredDate(resultSet.getTimestamp(COLUMN_EVENT_EXECUTION_DATE)); event.setCreated(resultSet.getTimestamp(COLUMN_EVENT_CREATED)); event.setCreatedByUserInfo( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java index 09f9fdd750ff..53d4e128a652 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java @@ -69,7 +69,7 @@ private Event getEvent(ResultSet rs) throws SQLException { event.setStatus(EventStatus.valueOf(rs.getString(EventQuery.getColumnName(COLUMNS.STATUS)))); event.setOccurredDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.EXECUTION_DATE))); - event.setDueDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.DUE_DATE))); + event.setScheduledDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.DUE_DATE))); event.setStoredBy(rs.getString(EventQuery.getColumnName(COLUMNS.STOREDBY))); event.setCompletedBy(rs.getString(EventQuery.getColumnName(COLUMNS.COMPLETEDBY))); event.setCompletedDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.COMPLETEDDATE))); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterService.java index eb8e00ce51fa..bc26b9d2110a 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterService.java @@ -90,7 +90,7 @@ public List to(List events) { e.setStatus(event.getStatus()); e.setOccurredAt(DateUtils.instantFromDate(event.getOccurredDate())); - e.setScheduledAt(DateUtils.instantFromDate(event.getDueDate())); + e.setScheduledAt(DateUtils.instantFromDate(event.getScheduledDate())); e.setStoredBy(event.getStoredBy()); e.setCompletedBy(event.getCompletedBy()); e.setCompletedAt(DateUtils.instantFromDate(event.getCompletedDate())); @@ -212,7 +212,7 @@ private Event from( result.setProgramStage(programStage); result.setOrganisationUnit(organisationUnit); result.setOccurredDate(DateUtils.fromInstant(event.getOccurredAt())); - result.setDueDate(DateUtils.fromInstant(event.getScheduledAt())); + result.setScheduledDate(DateUtils.fromInstant(event.getScheduledAt())); if (event.getAttributeOptionCombo().isNotBlank()) { result.setAttributeOptionCombo( @@ -241,9 +241,9 @@ private Event from( } if (program.isRegistration() - && result.getDueDate() == null + && result.getScheduledDate() == null && result.getOccurredDate() != null) { - result.setDueDate(result.getOccurredDate()); + result.setScheduledDate(result.getOccurredDate()); } for (DataValue dataValue : event.getDataValues()) { diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/mappers/EventMapper.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/mappers/EventMapper.java index 66bebe6c02aa..9b383a1ed4b7 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/mappers/EventMapper.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/mappers/EventMapper.java @@ -55,7 +55,7 @@ public interface EventMapper extends PreheatMapper { @Mapping(target = "created") @Mapping(target = "eventDataValues") @Mapping(target = "notes") - @Mapping(target = "dueDate") + @Mapping(target = "scheduledDate") @Mapping(target = "occurredDate") @Mapping(target = "completedDate") @Mapping(target = "completedBy") diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapperTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapperTest.java index 6d2ac17ac751..4941cb5e099a 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapperTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapperTest.java @@ -365,7 +365,7 @@ void shouldMapOrderInGivenOrder() throws BadRequestException, ForbiddenException .orderBy(UID.of(TEA_1_UID), SortDirection.ASC) .orderBy("programStage.uid", SortDirection.DESC) .orderBy(UID.of(DE_1_UID), SortDirection.DESC) - .orderBy("dueDate", SortDirection.ASC) + .orderBy("scheduledDate", SortDirection.ASC) .build(); EventQueryParams params = mapper.map(operationParams); @@ -376,7 +376,7 @@ void shouldMapOrderInGivenOrder() throws BadRequestException, ForbiddenException new Order(tea1, SortDirection.ASC), new Order("programStage.uid", SortDirection.DESC), new Order(de1, SortDirection.DESC), - new Order("dueDate", SortDirection.ASC)), + new Order("scheduledDate", SortDirection.ASC)), params.getOrder()); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterServiceTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterServiceTest.java index 8a5153657367..abeaa73d9462 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/converter/EventTrackerConverterServiceTest.java @@ -120,7 +120,7 @@ void setUpTest() { event.setOrganisationUnit(organisationUnit); event.setProgramStage(programStage); event.setEventDataValues(Sets.newHashSet()); - event.setDueDate(null); + event.setScheduledDate(null); event.setCompletedDate(null); event.setStoredBy(user.getUsername()); event.setLastUpdatedByUserInfo(UserInfoSnapshot.from(user)); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsServiceTest.java index e5d7bfd1252e..ba97b3659f8e 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsServiceTest.java @@ -416,7 +416,7 @@ public void setUpTest() throws IOException, InterruptedException { // Program Stage Instances (Events) Event eventA1 = createEvent(psA, piA, ouI); - eventA1.setDueDate(jan15); + eventA1.setScheduledDate(jan15); eventA1.setOccurredDate(jan15); eventA1.setUid("event0000A1"); eventA1.setEventDataValues( @@ -425,7 +425,7 @@ public void setUpTest() throws IOException, InterruptedException { eventA1.setAttributeOptionCombo(cocDefault); Event eventA2 = createEvent(psA, piA, ouJ); - eventA2.setDueDate(feb15); + eventA2.setScheduledDate(feb15); eventA2.setOccurredDate(feb15); eventA2.setUid("event0000A2"); eventA2.setEventDataValues( @@ -434,7 +434,7 @@ public void setUpTest() throws IOException, InterruptedException { eventA2.setAttributeOptionCombo(cocDefault); Event eventA3 = createEvent(psA, piA, ouK); - eventA3.setDueDate(mar15); + eventA3.setScheduledDate(mar15); eventA3.setOccurredDate(mar15); eventA3.setUid("event0000A3"); eventA3.setEventDataValues( @@ -443,7 +443,7 @@ public void setUpTest() throws IOException, InterruptedException { eventA3.setAttributeOptionCombo(cocDefault); Event eventB1 = createEvent(psB, piB, ouI); - eventB1.setDueDate(jan15); + eventB1.setScheduledDate(jan15); eventB1.setOccurredDate(jan15); eventB1.setUid("event0000B1"); eventB1.setEventDataValues( @@ -451,7 +451,7 @@ public void setUpTest() throws IOException, InterruptedException { eventB1.setAttributeOptionCombo(cocDefault); Event eventB2 = createEvent(psB, piB, ouI); - eventB2.setDueDate(jan20); + eventB2.setScheduledDate(jan20); eventB2.setOccurredDate(jan20); eventB2.setUid("event0000B2"); eventB2.setEventDataValues( @@ -459,7 +459,7 @@ public void setUpTest() throws IOException, InterruptedException { eventB2.setAttributeOptionCombo(cocDefault); Event eventB3 = createEvent(psB, piB, ouJ); - eventB3.setDueDate(jan15); + eventB3.setScheduledDate(jan15); eventB3.setOccurredDate(jan15); eventB3.setUid("event0000B3"); eventB3.setEventDataValues( @@ -467,7 +467,7 @@ public void setUpTest() throws IOException, InterruptedException { eventB3.setAttributeOptionCombo(cocDefault); Event eventB4 = createEvent(psB, piB, ouJ); - eventB4.setDueDate(jan20); + eventB4.setScheduledDate(jan20); eventB4.setOccurredDate(jan20); eventB4.setUid("event0000B4"); eventB4.setEventDataValues( @@ -475,7 +475,7 @@ public void setUpTest() throws IOException, InterruptedException { eventB4.setAttributeOptionCombo(cocDefault); Event eventB5 = createEvent(psB, piB, ouI); - eventB5.setDueDate(feb15); + eventB5.setScheduledDate(feb15); eventB5.setOccurredDate(feb15); eventB5.setUid("event0000B5"); eventB5.setEventDataValues( @@ -483,7 +483,7 @@ public void setUpTest() throws IOException, InterruptedException { eventB5.setAttributeOptionCombo(cocDefault); Event eventB6 = createEvent(psB, piB, ouI); - eventB6.setDueDate(feb15Noon); + eventB6.setScheduledDate(feb15Noon); eventB6.setOccurredDate(feb15Noon); eventB6.setUid("event0000B6"); eventB6.setEventDataValues( @@ -491,7 +491,7 @@ public void setUpTest() throws IOException, InterruptedException { eventB6.setAttributeOptionCombo(cocDefault); Event eventB7 = createEvent(psB, piB, ouJ); - eventB7.setDueDate(feb15); + eventB7.setScheduledDate(feb15); eventB7.setOccurredDate(feb15); eventB7.setUid("event0000B7"); eventB7.setEventDataValues( @@ -499,7 +499,7 @@ public void setUpTest() throws IOException, InterruptedException { eventB7.setAttributeOptionCombo(cocDefault); Event eventB8 = createEvent(psB, piB, ouJ); - eventB8.setDueDate(feb15Noon); + eventB8.setScheduledDate(feb15Noon); eventB8.setOccurredDate(feb15Noon); eventB8.setUid("event0000B8"); eventB8.setEventDataValues( diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/EventImportTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/EventImportTest.java index 3c05a7869eec..9969036bfc89 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/EventImportTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/EventImportTest.java @@ -293,7 +293,7 @@ void testAddEventWithDueDateForProgramWithoutRegistration() { Event psi = programStageInstanceService.getEvent(eventUid); - assertEquals(DUE_DATE, DateUtils.getLongDateString(psi.getDueDate())); + assertEquals(DUE_DATE, DateUtils.getLongDateString(psi.getScheduledDate())); } /** diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/HandleRelationshipsTrackedEntityServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/HandleRelationshipsTrackedEntityServiceTest.java index d3b07f7378db..eca0d966f56d 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/HandleRelationshipsTrackedEntityServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/HandleRelationshipsTrackedEntityServiceTest.java @@ -109,7 +109,7 @@ protected void setUpTest() throws Exception { enrollmentService.enrollTrackedEntity( trackedEntityA, programA, null, null, organisationUnitA); eventA = new Event(enrollmentA, programStageA1); - eventA.setDueDate(null); + eventA.setScheduledDate(null); eventA.setUid("UID-A"); CategoryCombo categoryComboA = createCategoryCombo('A'); CategoryOptionCombo categoryOptionComboA = createCategoryOptionCombo('A'); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/maintenance/MaintenanceServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/maintenance/MaintenanceServiceTest.java index ec3bb7a06bd5..6619ff554abb 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/maintenance/MaintenanceServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/maintenance/MaintenanceServiceTest.java @@ -311,7 +311,7 @@ void testDeleteSoftDeletedEnrollmentLinkedToATrackedEntityDataValueAudit() { DataElement dataElement = createDataElement('A'); dataElementService.addDataElement(dataElement); Event eventA = new Event(enrollment, program.getProgramStageByStage(1)); - eventA.setDueDate(enrollmentDate); + eventA.setScheduledDate(enrollmentDate); eventA.setUid("UID-A"); eventService.addEvent(eventA); TrackedEntityDataValueAudit trackedEntityDataValueAudit = @@ -342,7 +342,7 @@ void testDeleteSoftDeletedEventLinkedToARelationshipItem() { rType.getFromConstraint().setTrackedEntityType(trackedEntity.getTrackedEntityType()); relationshipTypeService.addRelationshipType(rType); Event eventA = new Event(enrollment, program.getProgramStageByStage(1)); - eventA.setDueDate(enrollmentDate); + eventA.setScheduledDate(enrollmentDate); eventA.setUid("UID-A"); long idA = eventService.addEvent(eventA); Relationship r = new Relationship(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/notification/ProgramNotificationMessageRendererTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/notification/ProgramNotificationMessageRendererTest.java index a2344d5ea537..059b8f96b3cb 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/notification/ProgramNotificationMessageRendererTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/notification/ProgramNotificationMessageRendererTest.java @@ -220,7 +220,7 @@ protected void setUpTest() throws Exception { // Event to be provided in message renderer eventA = new Event(enrollmentA, programStageA); eventA.setOrganisationUnit(organisationUnitA); - eventA.setDueDate(enrollmentDate); + eventA.setScheduledDate(enrollmentDate); eventA.setOccurredDate(new Date()); eventA.setUid("PSI-UID"); eventDataValueA = new EventDataValue(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EventServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EventServiceTest.java index e31305a05fcd..be0517fe0f54 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EventServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EventServiceTest.java @@ -219,19 +219,19 @@ public void setUpTest() { enrollmentB = new Enrollment(enrollmentDate, incidenDate, entityInstanceB, programB); enrollmentService.addEnrollment(enrollmentB); eventA = new Event(enrollmentA, stageA); - eventA.setDueDate(enrollmentDate); + eventA.setScheduledDate(enrollmentDate); eventA.setUid("UID-A"); eventB = new Event(enrollmentA, stageB); - eventB.setDueDate(enrollmentDate); + eventB.setScheduledDate(enrollmentDate); eventB.setUid("UID-B"); eventC = new Event(enrollmentB, stageC); - eventC.setDueDate(enrollmentDate); + eventC.setScheduledDate(enrollmentDate); eventC.setUid("UID-C"); eventD1 = new Event(enrollmentB, stageD); - eventD1.setDueDate(enrollmentDate); + eventD1.setScheduledDate(enrollmentDate); eventD1.setUid("UID-D1"); eventD2 = new Event(enrollmentB, stageD); - eventD2.setDueDate(enrollmentDate); + eventD2.setScheduledDate(enrollmentDate); eventD2.setUid("UID-D2"); /* * Prepare data for EventDataValues manipulation tests @@ -300,7 +300,7 @@ void testGetEventByUid() { void shouldNoteDeleteNoteWhenDeletingEvent() { Event event = new Event(enrollmentA, stageA); - event.setDueDate(enrollmentDate); + event.setScheduledDate(enrollmentDate); event.setUid(CodeGenerator.generateUid()); Note note = new Note(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EventStoreTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EventStoreTest.java index eee8944c4d94..982a595cd3ad 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EventStoreTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/EventStoreTest.java @@ -194,19 +194,19 @@ public void setUpTest() { enrollmentB = new Enrollment(enrollmentDate, incidenDate, entityInstanceB, programB); enrollmentService.addEnrollment(enrollmentB); eventA = new Event(enrollmentA, stageA); - eventA.setDueDate(enrollmentDate); + eventA.setScheduledDate(enrollmentDate); eventA.setUid("UID-A"); eventB = new Event(enrollmentA, stageB); - eventB.setDueDate(enrollmentDate); + eventB.setScheduledDate(enrollmentDate); eventB.setUid("UID-B"); eventC = new Event(enrollmentB, stageC); - eventC.setDueDate(enrollmentDate); + eventC.setScheduledDate(enrollmentDate); eventC.setUid("UID-C"); eventD1 = new Event(enrollmentB, stageD); - eventD1.setDueDate(enrollmentDate); + eventD1.setScheduledDate(enrollmentDate); eventD1.setUid("UID-D1"); eventD2 = new Event(enrollmentB, stageD); - eventD2.setDueDate(enrollmentDate); + eventD2.setScheduledDate(enrollmentDate); eventD2.setUid("UID-D2"); } @@ -330,13 +330,13 @@ void testGetWithScheduledNotifications() { Date yesterday = cal.getTime(); // Events Event eventA = new Event(enrollmentA, stageA); - eventA.setDueDate(tomorrow); + eventA.setScheduledDate(tomorrow); eventStore.save(eventA); Event eventB = new Event(enrollmentB, stageB); - eventB.setDueDate(today); + eventB.setScheduledDate(today); eventStore.save(eventB); Event eventC = new Event(enrollmentB, stageC); - eventC.setDueDate(yesterday); + eventC.setScheduledDate(yesterday); eventStore.save(eventC); // Queries List results; diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramMessageStoreTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramMessageStoreTest.java index 453d69dd704b..287a5c8df4bd 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramMessageStoreTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramMessageStoreTest.java @@ -156,7 +156,7 @@ public void setUpTest() { enrollmentA = new Enrollment(enrollmentDate, incidentDate, entityInstanceA, programA); enrollmentA.setUid("UID-A"); eventA = new Event(enrollmentA, stageA); - eventA.setDueDate(enrollmentDate); + eventA.setScheduledDate(enrollmentDate); eventA.setUid("UID-A"); Set ouSet = new HashSet<>(); ouSet.add(ouA); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEngineTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEngineTest.java index 682e03ca5891..2c91af1944d9 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEngineTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/programrule/engine/ProgramRuleEngineTest.java @@ -648,7 +648,7 @@ private void setupEvents() { enrollmentS.setUid("UID-PS"); enrollmentService.updateEnrollment(enrollmentS); Event eventA = new Event(enrollmentA, programStageA); - eventA.setDueDate(enrollmentDate); + eventA.setScheduledDate(enrollmentDate); eventA.setOccurredDate(new Date()); eventA.setUid("UID-PS1"); eventService.addEvent(eventA); @@ -668,24 +668,24 @@ private void setupEvents() { eventDataValueWithOptionSet.setValue(option1.getCode()); Event eventDate = new Event(enrollmentA, programStageAge); - eventDate.setDueDate(enrollmentDate); + eventDate.setScheduledDate(enrollmentDate); eventDate.setOccurredDate(psEventDate); eventDate.setUid("UID-PS12"); eventDate.setEventDataValues(Sets.newHashSet(eventDataValueDate)); eventService.addEvent(eventDate); Event eventAge = new Event(enrollmentA, programStageAge); - eventAge.setDueDate(enrollmentDate); + eventAge.setScheduledDate(enrollmentDate); eventAge.setOccurredDate(psEventDate); eventAge.setUid("UID-PS13"); eventAge.setEventDataValues(Sets.newHashSet(eventDataValueAge, eventDataValueWithOptionSet)); eventService.addEvent(eventAge); Event eventB = new Event(enrollmentA, programStageB); - eventB.setDueDate(enrollmentDate); + eventB.setScheduledDate(enrollmentDate); eventB.setOccurredDate(new Date()); eventB.setUid("UID-PS2"); eventService.addEvent(eventB); Event eventC = new Event(enrollmentA, programStageC); - eventC.setDueDate(enrollmentDate); + eventC.setScheduledDate(enrollmentDate); eventC.setOccurredDate(new Date()); eventC.setUid("UID-PS3"); eventService.addEvent(eventC); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/trackedentity/TrackerAccessManagerTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/trackedentity/TrackerAccessManagerTest.java index 0eca5ba2c47a..6900f8db223f 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/trackedentity/TrackerAccessManagerTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/trackedentity/TrackerAccessManagerTest.java @@ -172,7 +172,7 @@ protected void setUpTest() { eventB.setProgramStage(programStageB); eventB.setOrganisationUnit(orgUnitB); eventB.setStatus(EventStatus.SCHEDULE); - eventB.setDueDate(DateUtils.addDays(new Date(), 10)); + eventB.setScheduledDate(DateUtils.addDays(new Date(), 10)); manager.save(eventB, false); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java index cfca6375f2df..6bbc9c6b9793 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java @@ -1042,7 +1042,7 @@ void shouldOrderEventsRespectingOrderWhenDataElementSuppliedBeforeOrderParam() EventOperationParams params = eventParamsBuilder .orgUnitUid(orgUnit.getUid()) - .orderBy("dueDate", SortDirection.DESC) + .orderBy("scheduledDate", SortDirection.DESC) .orderBy(UID.of("DATAEL00006"), SortDirection.DESC) .orderBy("enrollment.enrollmentDate", SortDirection.DESC) .build(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java index 8b9743878a76..d8a74b448dd2 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java @@ -284,10 +284,11 @@ void testExportEventsWithDatesIncludingTimeStamp() () -> assertEquals( "2019-01-28T12:32:38.100", - DateUtils.getIso8601NoTz(event.getDueDate()), + DateUtils.getIso8601NoTz(event.getScheduledDate()), () -> String.format( - "Expected %s to be in %s", event.getDueDate(), "2019-01-28T12:32:38.100")), + "Expected %s to be in %s", + event.getScheduledDate(), "2019-01-28T12:32:38.100")), () -> assertHasTimeStamp(event.getCompletedDate())); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java index 25ee1f3eb0dc..c1f671d8f381 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java @@ -303,7 +303,7 @@ protected void setUpTest() throws Exception { eventA.setOrganisationUnit(orgUnitA); eventA.setAttributeOptionCombo(defaultCategoryOptionCombo); eventA.setOccurredDate(parseDate("2021-05-27T12:05:00.000")); - eventA.setDueDate(parseDate("2021-02-27T12:05:00.000")); + eventA.setScheduledDate(parseDate("2021-02-27T12:05:00.000")); eventA.setCompletedDate(parseDate("2021-02-27T11:05:00.000")); eventA.setCompletedBy("herb"); eventA.setAssignedUser(user); @@ -1298,7 +1298,7 @@ void shouldReturnEventMappedCorrectly() () -> assertEquals(user, event.getAssignedUser()), () -> checkDate(currentTime, event.getCreated()), () -> checkDate(currentTime, event.getLastUpdated()), - () -> checkDate(eventA.getDueDate(), event.getDueDate()), + () -> checkDate(eventA.getScheduledDate(), event.getScheduledDate()), () -> checkDate(currentTime, event.getCreatedAtClient()), () -> checkDate(currentTime, event.getLastUpdatedAtClient()), () -> checkDate(eventA.getCompletedDate(), event.getCompletedDate()), diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventMapper.java index 4a60b6485908..6c73596488cb 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventMapper.java @@ -76,7 +76,7 @@ public interface EventMapper entry("orgUnit", "organisationUnit.uid"), entry("program", "enrollment.program.uid"), entry("programStage", "programStage.uid"), - entry("scheduledAt", "dueDate"), + entry("scheduledAt", "scheduledDate"), entry("status", "status"), entry("storedBy", "storedBy"), entry("trackedEntity", "enrollment.trackedEntity.uid"), @@ -90,7 +90,7 @@ public interface EventMapper @Mapping(target = "trackedEntity", source = "enrollment.trackedEntity.uid") @Mapping(target = "orgUnit", source = "organisationUnit.uid") @Mapping(target = "occurredAt", source = "occurredDate") - @Mapping(target = "scheduledAt", source = "dueDate") + @Mapping(target = "scheduledAt", source = "scheduledDate") @Mapping(target = "legacyFollowUp", source = "enrollment.followup") // Deprecated 2.41 @Mapping(target = "followUp", source = "enrollment.followup") @Mapping(target = "createdAt", source = "created") diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java index 02fb108a0248..021ec0c6565f 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java @@ -100,7 +100,7 @@ default EnrollmentStatus from(ProgramStatus programStatus) { @Mapping(target = "enrollment", source = "enrollment.uid") @Mapping(target = "orgUnit", source = "organisationUnit.uid") @Mapping(target = "occurredAt", source = "occurredDate") - @Mapping(target = "scheduledAt", source = "dueDate") + @Mapping(target = "scheduledAt", source = "scheduledDate") @Mapping(target = "followUp", source = "enrollment.followup") @Mapping(target = "legacyFollowUp", source = "enrollment.followup") @Mapping(target = "createdAt", source = "created") diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java index 2d9f2d427f0d..7099161a8708 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java @@ -520,7 +520,7 @@ void shouldMapOrderParameterInGivenOrderWhenFieldsAreOrderable() throws BadReque new Order("created", SortDirection.ASC), new Order(UID.of("zGlzbfreTOH"), SortDirection.ASC), new Order("programStage.uid", SortDirection.DESC), - new Order("dueDate", SortDirection.ASC)), + new Order("scheduledDate", SortDirection.ASC)), params.getOrder()); } From f93bc5ce3cb8545ea126a2cd54b448e532e39e30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 08:20:07 +0000 Subject: [PATCH 34/63] chore(deps): bump org.apache.maven.plugins:maven-javadoc-plugin (#15621) Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.6.0 to 3.6.2. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.6.0...maven-javadoc-plugin-3.6.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index bcd3ccfb6cf1..0a53dc254372 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -229,7 +229,7 @@ 3.11.0 3.3.1 3.2.1 - 3.6.0 + 3.6.2 3.1.0 3.4.1 3.5.0 From 94e33c8e90e6a72c6a98c54777211c13791b436f Mon Sep 17 00:00:00 2001 From: netroms Date: Wed, 8 Nov 2023 16:49:14 +0800 Subject: [PATCH 35/63] fix: add support for Hikari pool metrics [DHIS2-15419] (#15623) * fix: add support for Hikari pool metrics --- .../dhis-support/dhis-support-system/pom.xml | 4 + .../metrics/DataSourcePoolMetricsConfig.java | 32 ++++--- ...etadata.java => AbstractPoolMetadata.java} | 7 +- .../metrics/jdbc/C3p0MetadataProvider.java | 2 +- ...ava => CompositePoolMetadataProvider.java} | 21 +++-- .../metrics/jdbc/HikariMetadataProvider.java | 78 +++++++++++++++++ .../jdbc/HikariPoolMetadataAccessor.java | 84 +++++++++++++++++++ ...rcePoolMetadata.java => PoolMetadata.java} | 2 +- ...rovider.java => PoolMetadataProvider.java} | 8 +- ...viders.java => PoolMetadataProviders.java} | 20 ++--- ...ourcePoolMetrics.java => PoolMetrics.java} | 51 +++++------ 11 files changed, 234 insertions(+), 75 deletions(-) rename dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/{AbstractDataSourcePoolMetadata.java => AbstractPoolMetadata.java} (90%) rename dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/{CompositeDataSourcePoolMetadataProvider.java => CompositePoolMetadataProvider.java} (72%) create mode 100644 dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/HikariMetadataProvider.java create mode 100644 dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/HikariPoolMetadataAccessor.java rename dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/{DataSourcePoolMetadata.java => PoolMetadata.java} (98%) rename dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/{DataSourcePoolMetadataProvider.java => PoolMetadataProvider.java} (85%) rename dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/{DataSourcePoolMetadataProviders.java => PoolMetadataProviders.java} (72%) rename dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/{DataSourcePoolMetrics.java => PoolMetrics.java} (67%) diff --git a/dhis-2/dhis-support/dhis-support-system/pom.xml b/dhis-2/dhis-support/dhis-support-system/pom.xml index e196b7084d00..c089cbf8d070 100644 --- a/dhis-2/dhis-support/dhis-support-system/pom.xml +++ b/dhis-2/dhis-support/dhis-support-system/pom.xml @@ -237,6 +237,10 @@ org.apache.httpcomponents httpcore + + com.zaxxer + HikariCP + diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/DataSourcePoolMetricsConfig.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/DataSourcePoolMetricsConfig.java index 220ee4978d44..9263ecdd64cd 100644 --- a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/DataSourcePoolMetricsConfig.java +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/DataSourcePoolMetricsConfig.java @@ -29,18 +29,20 @@ import static org.hisp.dhis.external.conf.ConfigurationKey.MONITORING_DBPOOL_ENABLED; -import com.google.common.collect.Lists; import com.mchange.v2.c3p0.ComboPooledDataSource; +import com.zaxxer.hikari.HikariDataSource; import io.micrometer.core.instrument.MeterRegistry; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; import org.hisp.dhis.external.conf.ConfigurationKey; import org.hisp.dhis.monitoring.metrics.jdbc.C3p0MetadataProvider; -import org.hisp.dhis.monitoring.metrics.jdbc.DataSourcePoolMetadataProvider; -import org.hisp.dhis.monitoring.metrics.jdbc.DataSourcePoolMetrics; +import org.hisp.dhis.monitoring.metrics.jdbc.HikariMetadataProvider; +import org.hisp.dhis.monitoring.metrics.jdbc.PoolMetadataProvider; +import org.hisp.dhis.monitoring.metrics.jdbc.PoolMetrics; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; @@ -59,10 +61,10 @@ static class DataSourcePoolMetadataMetricsConfiguration { private final MeterRegistry registry; - private final Collection metadataProviders; + private final Collection metadataProviders; DataSourcePoolMetadataMetricsConfiguration( - MeterRegistry registry, Collection metadataProviders) { + MeterRegistry registry, Collection metadataProviders) { this.registry = registry; this.metadataProviders = metadataProviders; } @@ -74,8 +76,7 @@ public void bindDataSourcesToRegistry(Map dataSources) { private void bindDataSourceToRegistry(String beanName, DataSource dataSource) { String dataSourceName = getDataSourceName(beanName); - new DataSourcePoolMetrics( - dataSource, this.metadataProviders, dataSourceName, Collections.emptyList()) + new PoolMetrics(dataSource, this.metadataProviders, dataSourceName, Collections.emptyList()) .bindTo(this.registry); } @@ -95,11 +96,18 @@ private String getDataSourceName(String beanName) { } @Bean - public Collection dataSourceMetadataProvider() { - DataSourcePoolMetadataProvider provider = - dataSource -> new C3p0MetadataProvider((ComboPooledDataSource) dataSource); - - return Lists.newArrayList(provider); + public Collection dataSourceMetadataProvider() { + return List.of( + dataSource -> { + if (dataSource instanceof ComboPooledDataSource comboPooledDataSource) { + return new C3p0MetadataProvider(comboPooledDataSource); + } else if (dataSource instanceof HikariDataSource hikariDataSource) { + return new HikariMetadataProvider(hikariDataSource); + } else { + throw new IllegalArgumentException( + "Unsupported DataSource type: " + dataSource.getClass().getName()); + } + }); } static class DataSourcePoolMetricsEnabledCondition extends MetricsEnabler { diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/AbstractDataSourcePoolMetadata.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/AbstractPoolMetadata.java similarity index 90% rename from dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/AbstractDataSourcePoolMetadata.java rename to dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/AbstractPoolMetadata.java index 787f90478476..56f1d2a978f6 100644 --- a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/AbstractDataSourcePoolMetadata.java +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/AbstractPoolMetadata.java @@ -30,14 +30,13 @@ import javax.sql.DataSource; /** - * A base {@link DataSourcePoolMetadata} implementation. + * A base {@link PoolMetadata} implementation. * * @param the data source type * @author Stephane Nicoll * @since 2.0.0 */ -public abstract class AbstractDataSourcePoolMetadata - implements DataSourcePoolMetadata { +public abstract class AbstractPoolMetadata implements PoolMetadata { private final T dataSource; @@ -46,7 +45,7 @@ public abstract class AbstractDataSourcePoolMetadata * * @param dataSource the data source */ - protected AbstractDataSourcePoolMetadata(T dataSource) { + protected AbstractPoolMetadata(T dataSource) { this.dataSource = dataSource; } diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/C3p0MetadataProvider.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/C3p0MetadataProvider.java index 1104e812705d..46bbb7fbb5cd 100644 --- a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/C3p0MetadataProvider.java +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/C3p0MetadataProvider.java @@ -35,7 +35,7 @@ * @author Luciano Fiandesio */ @Slf4j -public class C3p0MetadataProvider extends AbstractDataSourcePoolMetadata { +public class C3p0MetadataProvider extends AbstractPoolMetadata { /** * Create an instance with the data source to use. * diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/CompositeDataSourcePoolMetadataProvider.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/CompositePoolMetadataProvider.java similarity index 72% rename from dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/CompositeDataSourcePoolMetadataProvider.java rename to dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/CompositePoolMetadataProvider.java index 33eaff860991..67739d46f3b1 100644 --- a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/CompositeDataSourcePoolMetadataProvider.java +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/CompositePoolMetadataProvider.java @@ -34,23 +34,22 @@ import javax.sql.DataSource; /** - * A {@link DataSourcePoolMetadataProvider} implementation that returns the first {@link - * DataSourcePoolMetadata} that is found by one of its delegate. + * A {@link PoolMetadataProvider} implementation that returns the first {@link PoolMetadata} that is + * found by one of its delegate. * * @author Stephane Nicoll * @since 2.0.0 */ -public class CompositeDataSourcePoolMetadataProvider implements DataSourcePoolMetadataProvider { - private final List providers; +public class CompositePoolMetadataProvider implements PoolMetadataProvider { + private final List providers; /** - * Create a {@link CompositeDataSourcePoolMetadataProvider} instance with an initial collection of - * delegates to use. + * Create a {@link CompositePoolMetadataProvider} instance with an initial collection of delegates + * to use. * * @param providers the data source pool metadata providers */ - public CompositeDataSourcePoolMetadataProvider( - Collection providers) { + public CompositePoolMetadataProvider(Collection providers) { this.providers = (providers != null) ? Collections.unmodifiableList(new ArrayList<>(providers)) @@ -58,9 +57,9 @@ public CompositeDataSourcePoolMetadataProvider( } @Override - public DataSourcePoolMetadata getDataSourcePoolMetadata(DataSource dataSource) { - for (DataSourcePoolMetadataProvider provider : this.providers) { - DataSourcePoolMetadata metadata = provider.getDataSourcePoolMetadata(dataSource); + public PoolMetadata getDataSourcePoolMetadata(DataSource dataSource) { + for (PoolMetadataProvider provider : this.providers) { + PoolMetadata metadata = provider.getDataSourcePoolMetadata(dataSource); if (metadata != null) { return metadata; } diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/HikariMetadataProvider.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/HikariMetadataProvider.java new file mode 100644 index 000000000000..217e3304f5dd --- /dev/null +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/HikariMetadataProvider.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.monitoring.metrics.jdbc; + +import com.zaxxer.hikari.HikariDataSource; + +/** + * @author Morten Svanæs + */ +public class HikariMetadataProvider extends AbstractPoolMetadata { + + private HikariPoolMetadataAccessor hikariDataSourcePoolMetadata; + + /** + * Create an instance with the data source to use. + * + * @param dataSource the data source + */ + public HikariMetadataProvider(HikariDataSource dataSource) { + super(dataSource); + this.hikariDataSourcePoolMetadata = new HikariPoolMetadataAccessor(getDataSource()); + } + + @Override + public Integer getActive() { + return hikariDataSourcePoolMetadata.getActive(); + } + + @Override + public Integer getMax() { + return hikariDataSourcePoolMetadata.getMax(); + } + + @Override + public Integer getMin() { + return hikariDataSourcePoolMetadata.getMin(); + } + + @Override + public String getValidationQuery() { + return ""; + } + + @Override + public Boolean getDefaultAutoCommit() { + return hikariDataSourcePoolMetadata.getDefaultAutoCommit(); + } + + @Override + public Integer getIdle() { + return hikariDataSourcePoolMetadata.getIdle(); + } +} diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/HikariPoolMetadataAccessor.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/HikariPoolMetadataAccessor.java new file mode 100644 index 000000000000..40039148a65e --- /dev/null +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/HikariPoolMetadataAccessor.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.monitoring.metrics.jdbc; + +import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.pool.HikariPool; +import org.springframework.beans.DirectFieldAccessor; + +/** + * @author Morten Svanæs + */ +public class HikariPoolMetadataAccessor extends AbstractPoolMetadata { + + public HikariPoolMetadataAccessor(HikariDataSource dataSource) { + super(dataSource); + } + + @Override + public Integer getActive() { + try { + return getHikariPool().getActiveConnections(); + } catch (Exception ex) { + return null; + } + } + + @Override + public Integer getIdle() { + try { + return getHikariPool().getIdleConnections(); + } catch (Exception ex) { + return null; + } + } + + private HikariPool getHikariPool() { + return (HikariPool) new DirectFieldAccessor(getDataSource()).getPropertyValue("pool"); + } + + @Override + public Integer getMax() { + return getDataSource().getMaximumPoolSize(); + } + + @Override + public Integer getMin() { + return getDataSource().getMinimumIdle(); + } + + @Override + public String getValidationQuery() { + return getDataSource().getConnectionTestQuery(); + } + + @Override + public Boolean getDefaultAutoCommit() { + return getDataSource().isAutoCommit(); + } +} diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetadata.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetadata.java similarity index 98% rename from dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetadata.java rename to dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetadata.java index f429d819895e..6cd51ba5f28c 100644 --- a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetadata.java +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetadata.java @@ -36,7 +36,7 @@ * @author Stephane Nicoll * @since 2.0.0 */ -public interface DataSourcePoolMetadata { +public interface PoolMetadata { /** * Return the usage of the pool as value between 0 and 1 (or -1 if the pool is not limited). diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetadataProvider.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetadataProvider.java similarity index 85% rename from dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetadataProvider.java rename to dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetadataProvider.java index 221e014571fb..0affbd065749 100644 --- a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetadataProvider.java +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetadataProvider.java @@ -33,13 +33,13 @@ * @author Luciano Fiandesio */ @FunctionalInterface -public interface DataSourcePoolMetadataProvider { +public interface PoolMetadataProvider { /** - * Return the {@link DataSourcePoolMetadata} instance able to manage the specified {@link - * DataSource} or {@code null} if the given data source could not be handled. + * Return the {@link PoolMetadata} instance able to manage the specified {@link DataSource} or + * {@code null} if the given data source could not be handled. * * @param dataSource the data source. * @return the data source pool metadata. */ - DataSourcePoolMetadata getDataSourcePoolMetadata(DataSource dataSource); + PoolMetadata getDataSourcePoolMetadata(DataSource dataSource); } diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetadataProviders.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetadataProviders.java similarity index 72% rename from dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetadataProviders.java rename to dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetadataProviders.java index e284f9a440dc..cea99e86252d 100644 --- a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetadataProviders.java +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetadataProviders.java @@ -34,31 +34,29 @@ import javax.sql.DataSource; /** - * A {@link DataSourcePoolMetadataProvider} implementation that returns the first {@link - * DataSourcePoolMetadata} that is found by one of its delegate. + * A {@link PoolMetadataProvider} implementation that returns the first {@link PoolMetadata} that is + * found by one of its delegate. * * @author Stephane Nicoll * @since 1.2.0 */ -public class DataSourcePoolMetadataProviders implements DataSourcePoolMetadataProvider { +public class PoolMetadataProviders implements PoolMetadataProvider { - private final List providers; + private final List providers; /** - * Create a {@link DataSourcePoolMetadataProviders} instance with an initial collection of - * delegates to use. + * Create a {@link PoolMetadataProviders} instance with an initial collection of delegates to use. * * @param providers the data source pool metadata providers */ - public DataSourcePoolMetadataProviders( - Collection providers) { + public PoolMetadataProviders(Collection providers) { this.providers = (providers == null ? Collections.emptyList() : new ArrayList<>(providers)); } @Override - public DataSourcePoolMetadata getDataSourcePoolMetadata(DataSource dataSource) { - for (DataSourcePoolMetadataProvider provider : this.providers) { - DataSourcePoolMetadata metadata = provider.getDataSourcePoolMetadata(dataSource); + public PoolMetadata getDataSourcePoolMetadata(DataSource dataSource) { + for (PoolMetadataProvider provider : this.providers) { + PoolMetadata metadata = provider.getDataSourcePoolMetadata(dataSource); if (metadata != null) { return metadata; } diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetrics.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetrics.java similarity index 67% rename from dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetrics.java rename to dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetrics.java index 1d49677a361d..b53791432f5b 100644 --- a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/DataSourcePoolMetrics.java +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/monitoring/metrics/jdbc/PoolMetrics.java @@ -41,28 +41,24 @@ /** * @author Jon Schneider */ -public class DataSourcePoolMetrics implements MeterBinder { +public class PoolMetrics implements MeterBinder { private final DataSource dataSource; private final CachingDataSourcePoolMetadataProvider metadataProvider; private final Iterable tags; - public DataSourcePoolMetrics( + public PoolMetrics( DataSource dataSource, - Collection metadataProviders, + Collection metadataProviders, String dataSourceName, Iterable tags) { - this( - dataSource, - new CompositeDataSourcePoolMetadataProvider(metadataProviders), - dataSourceName, - tags); + this(dataSource, new CompositePoolMetadataProvider(metadataProviders), dataSourceName, tags); } - public DataSourcePoolMetrics( + public PoolMetrics( DataSource dataSource, - DataSourcePoolMetadataProvider metadataProvider, + PoolMetadataProvider metadataProvider, String name, Iterable tags) { Assert.notNull(dataSource, "DataSource must not be null"); @@ -75,15 +71,15 @@ public DataSourcePoolMetrics( @Override public void bindTo(MeterRegistry registry) { if (this.metadataProvider.getDataSourcePoolMetadata(this.dataSource) != null) { - bindPoolMetadata(registry, "active", DataSourcePoolMetadata::getActive); - bindPoolMetadata(registry, "idle", DataSourcePoolMetadata::getIdle); - bindPoolMetadata(registry, "max", DataSourcePoolMetadata::getMax); - bindPoolMetadata(registry, "min", DataSourcePoolMetadata::getMin); + bindPoolMetadata(registry, "active", PoolMetadata::getActive); + bindPoolMetadata(registry, "idle", PoolMetadata::getIdle); + bindPoolMetadata(registry, "max", PoolMetadata::getMax); + bindPoolMetadata(registry, "min", PoolMetadata::getMin); } } private void bindPoolMetadata( - MeterRegistry registry, String metricName, Function function) { + MeterRegistry registry, String metricName, Function function) { bindDataSource(registry, metricName, this.metadataProvider.getValueFunction(function)); } @@ -94,35 +90,28 @@ private void bindDataSource( "jdbc.connections." + metricName, this.tags, this.dataSource, - (m) -> function.apply(m).doubleValue()); + m -> function.apply(m).doubleValue()); } } - private static class CachingDataSourcePoolMetadataProvider - implements DataSourcePoolMetadataProvider { + private static class CachingDataSourcePoolMetadataProvider implements PoolMetadataProvider { - private static final Map cache = - new ConcurrentReferenceHashMap<>(); + private static final Map cache = new ConcurrentReferenceHashMap<>(); - private final DataSourcePoolMetadataProvider metadataProvider; + private final PoolMetadataProvider metadataProvider; - CachingDataSourcePoolMetadataProvider(DataSourcePoolMetadataProvider metadataProvider) { + CachingDataSourcePoolMetadataProvider(PoolMetadataProvider metadataProvider) { this.metadataProvider = metadataProvider; } Function getValueFunction( - Function function) { - return (dataSource) -> function.apply(getDataSourcePoolMetadata(dataSource)); + Function function) { + return dS -> function.apply(getDataSourcePoolMetadata(dS)); } @Override - public DataSourcePoolMetadata getDataSourcePoolMetadata(DataSource dataSource) { - DataSourcePoolMetadata metadata = cache.get(dataSource); - if (metadata == null) { - metadata = this.metadataProvider.getDataSourcePoolMetadata(dataSource); - cache.put(dataSource, metadata); - } - return metadata; + public PoolMetadata getDataSourcePoolMetadata(DataSource dataSource) { + return cache.computeIfAbsent(dataSource, this.metadataProvider::getDataSourcePoolMetadata); } } } From 9ecd18478c165747fff77dcf9294476b10f59e57 Mon Sep 17 00:00:00 2001 From: Jan Bernitt Date: Wed, 8 Nov 2023 10:46:06 +0100 Subject: [PATCH 36/63] feat: persistent errors for job processing [DHIS2-15276] (#15575) * fix: pickup manually run jobs that have been executed before [DHIS2-15027] * feat: persistent errors for job processing [DHIS2-15276] * fix: message arguments from array [DHIS2-15276] * fix: NPE in error messages [DHIS2-15276] * fix: OpenAPI name conflict [DHIS2-15276] * fix: sonar issues [DHIS2-15276] * fix: send emails async to not fail TX in case email is not configured [DHIS2-15276] * chore: rename asny method [DHIS2-15276] * fix: catch errors when adding errors, use empty string for undefined UID [DHIS2-15276] * fix: require auth to cancel jobs [DHIS2-15276] --- .../org/hisp/dhis/feedback/ErrorMessage.java | 41 +++--- .../org/hisp/dhis/feedback/ErrorReport.java | 118 ++++-------------- .../org/hisp/dhis/message/MessageService.java | 3 +- .../hisp/dhis/preheat/PreheatErrorReport.java | 2 +- .../dhis/scheduling/JobConfiguration.java | 4 + .../scheduling/JobConfigurationService.java | 6 +- .../scheduling/JobConfigurationStore.java | 6 +- .../org/hisp/dhis/scheduling/JobProgress.java | 113 ++++++++++++++--- .../dhis/scheduling/JobSchedulerService.java | 4 + .../org/hisp/dhis/scheduling/JobType.java | 9 +- .../event/data/DefaultQueryItemLocator.java | 7 +- .../org/hisp/dhis/config/StartupConfig.java | 6 +- .../dhis/message/DefaultMessageService.java | 6 +- .../DefaultJobConfigurationService.java | 16 +-- .../DefaultJobSchedulerLoopService.java | 39 +++++- .../DefaultJobSchedulerService.java | 23 +++- .../hisp/dhis/scheduling/HeartbeatJob.java | 2 +- .../HibernateJobConfigurationStore.java | 37 +++++- .../hisp/dhis/scheduling/JobScheduler.java | 11 ++ .../scheduling/JobSchedulerLoopService.java | 6 + .../dhis/scheduling/RecordingJobProgress.java | 37 +++++- .../org/hisp/dhis/startup/SchedulerStart.java | 3 - .../hibernate/JobConfiguration.hbm.xml | 3 + .../DefaultMetadataWorkflowService.java | 4 +- .../validation/scheduling/MonitoringJob.java | 2 +- .../dhis/tracker/imports/report/Error.java | 2 + ...2_41_32__job_configuation_errors_in_db.sql | 11 ++ .../metadata/MetadataImportJob.java | 12 ++ .../JobConfigurationController.java | 21 +++- 29 files changed, 361 insertions(+), 193 deletions(-) create mode 100644 dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_32__job_configuation_errors_in_db.sql diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/feedback/ErrorMessage.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/feedback/ErrorMessage.java index 222e69cf96f3..88ac061d3a59 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/feedback/ErrorMessage.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/feedback/ErrorMessage.java @@ -30,41 +30,40 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.text.MessageFormat; +import java.util.List; +import java.util.stream.Stream; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import lombok.Getter; +import lombok.ToString; /** * @author Morten Olav Hansen */ +@Getter +@ToString public class ErrorMessage { - private final ErrorCode errorCode; - private final Object[] args; - - private final String message; + @JsonProperty private final ErrorCode errorCode; + @JsonProperty private final List args; + @JsonProperty private String message; public ErrorMessage(ErrorCode errorCode, Object... args) { this.errorCode = errorCode; - this.args = args; - this.message = MessageFormat.format(errorCode.getMessage(), this.args); + this.args = + Stream.of(args) + .map(obj -> obj == null ? null : obj.toString()) + .toList(); // OBS! Must support null values! + this.message = MessageFormat.format(errorCode.getMessage(), args); } @JsonCreator public ErrorMessage( - @JsonProperty("message") String message, @JsonProperty("errorCode") ErrorCode errorCode) { + @Nonnull @JsonProperty("message") String message, + @Nonnull @JsonProperty("errorCode") ErrorCode errorCode, + @CheckForNull @JsonProperty("args") List args) { this.errorCode = errorCode; - this.args = null; + this.args = args == null ? List.of() : args; this.message = message; } - - public ErrorCode getErrorCode() { - return errorCode; - } - - public String getMessage() { - return message; - } - - @Override - public String toString() { - return String.format("[%s: '%s']", errorCode.name(), message); - } } diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/feedback/ErrorReport.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/feedback/ErrorReport.java index 32729ce25797..aaf4f74e5e18 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/feedback/ErrorReport.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/feedback/ErrorReport.java @@ -29,133 +29,67 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; -import com.google.common.base.MoreObjects; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.hisp.dhis.common.DxfNamespaces; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; /** * @author Morten Olav Hansen */ -@JacksonXmlRootElement(localName = "errorReport", namespace = DxfNamespaces.DXF_2_0) +@ToString +@Getter +@Setter +@Accessors(chain = true) public class ErrorReport { - protected final ErrorMessage message; - protected final Class mainKlass; + private final ErrorMessage message; + @JsonProperty private final Class mainKlass; + @JsonProperty private String mainId; + @JsonProperty private Class errorKlass; + @JsonProperty private String errorProperty; + @Nonnull @JsonProperty private List errorProperties; + @JsonProperty private Object value; - protected String mainId; - - protected Class errorKlass; - - protected String errorProperty; - - protected List errorProperties = new ArrayList<>(); - - protected Object value; - - public ErrorReport(Class mainKlass, ErrorCode errorCode, Object... args) { + public ErrorReport(@Nonnull Class mainKlass, @Nonnull ErrorCode errorCode, Object... args) { this.mainKlass = mainKlass; this.message = new ErrorMessage(errorCode, args); - this.errorProperties.addAll(Arrays.asList(args)); + this.errorProperties = Arrays.asList(args); // OBS! Must support null values! } - public ErrorReport(Class mainKlass, ErrorMessage message) { + public ErrorReport(@Nonnull Class mainKlass, @Nonnull ErrorMessage message) { this.mainKlass = mainKlass; this.message = message; + this.errorProperties = message.getArgs(); } @JsonCreator public ErrorReport( @JsonProperty("message") String message, + @CheckForNull @JsonProperty("args") List args, @JsonProperty("mainKlass") Class mainKlass, @JsonProperty("errorCode") ErrorCode errorCode) { this.mainKlass = mainKlass; - this.message = new ErrorMessage(message, errorCode); + this.message = new ErrorMessage(message, errorCode, args); + this.errorProperties = args == null ? List.of() : args; } @JsonProperty - @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) public ErrorCode getErrorCode() { return message.getErrorCode(); } @JsonProperty - @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) public String getMessage() { return message.getMessage(); } @JsonProperty - @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) - public Class getMainKlass() { - return mainKlass; - } - - @JsonProperty - @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) - public String getMainId() { - return mainId; - } - - public ErrorReport setMainId(String mainId) { - this.mainId = mainId; - return this; - } - - @JsonProperty - @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) - public Class getErrorKlass() { - return errorKlass; - } - - public ErrorReport setErrorKlass(Class errorKlass) { - this.errorKlass = errorKlass; - return this; - } - - @JsonProperty - @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) - public String getErrorProperty() { - return errorProperty; - } - - public ErrorReport setErrorProperty(String errorProperty) { - this.errorProperty = errorProperty; - return this; - } - - @JsonProperty - @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) - public List getErrorProperties() { - return errorProperties; - } - - public void setErrorProperties(List errorProperties) { - this.errorProperties = errorProperties; - } - - @JsonProperty - @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) - public Object getValue() { - return value; - } - - public ErrorReport setValue(Object value) { - this.value = value; - return this; - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this) - .add("message", getMessage()) - .add("errorCode", message.getErrorCode()) - .add("mainKlass", mainKlass) - .add("errorKlass", errorKlass) - .add("value", value) - .toString(); + public List getArgs() { + return message.getArgs(); } } diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/message/MessageService.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/message/MessageService.java index 4b9011600d9f..7c1bfd41baaa 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/message/MessageService.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/message/MessageService.java @@ -30,6 +30,7 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import javax.annotation.Nonnull; import org.hisp.dhis.dataset.CompleteDataSetRegistration; import org.hisp.dhis.fileresource.FileResource; import org.hisp.dhis.user.User; @@ -56,7 +57,7 @@ long sendValidationMessage( long sendMessage(MessageConversationParams params); - long sendSystemErrorNotification(String subject, Throwable t); + void asyncSendSystemErrorNotification(@Nonnull String subject, @Nonnull Throwable t); void sendReply( MessageConversation conversation, diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/preheat/PreheatErrorReport.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/preheat/PreheatErrorReport.java index 23d53f6d34fc..39853cd9a2dd 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/preheat/PreheatErrorReport.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/preheat/PreheatErrorReport.java @@ -75,6 +75,6 @@ public PreheatIdentifier getPreheatIdentifier() { } public IdentifiableObject getObjectReference() { - return value != null ? (IdentifiableObject) value : null; + return getValue() != null ? (IdentifiableObject) getValue() : null; } } diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfiguration.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfiguration.java index 7eca33034291..2ae1d3a13a15 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfiguration.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfiguration.java @@ -166,6 +166,10 @@ public class JobConfiguration extends BaseIdentifiableObject implements Secondar @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Integer queuePosition; + @CheckForNull + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private String errorCodes; + public JobConfiguration() {} /** diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfigurationService.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfigurationService.java index 49aef39a283e..fd12a9b467d2 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfigurationService.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfigurationService.java @@ -55,11 +55,7 @@ String create(JobConfiguration config, MimeType contentType, InputStream content */ int createDefaultJobs(); - /** - * Make sure the {@link JobType#HEARTBEAT} entry exists as it is responsible for spawning the - * other system jobs when needed using {@link #createDefaultJobs()}. - */ - void createHeartbeatJob(); + void createDefaultJob(JobType type); /** * Updates all {@link JobConfiguration}s that are not {@link JobConfiguration#isEnabled()} to diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfigurationStore.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfigurationStore.java index 4994f62d395c..a0d90d73df58 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfigurationStore.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobConfigurationStore.java @@ -69,6 +69,9 @@ public interface JobConfigurationStore extends GenericDimensionalObjectStore args) { + // default implementation is a NOOP, we don't remember or handle the error + } + /* * Tracking API: */ @@ -563,15 +569,86 @@ enum FailurePolicy { @Getter final class Progress { - @JsonValue final Deque sequence; + @Nonnull @JsonProperty final Deque sequence; + + @Nonnull + @JsonProperty + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private final Map>> errors; public Progress() { this.sequence = new ConcurrentLinkedDeque<>(); + this.errors = new ConcurrentHashMap<>(); } @JsonCreator - public Progress(Deque sequence) { + public Progress( + @Nonnull @JsonProperty("sequence") Deque sequence, + @CheckForNull @JsonProperty("errors") Map>> errors) { this.sequence = sequence; + this.errors = errors == null ? Map.of() : errors; + } + + public void addError(Error error) { + errors + .computeIfAbsent(error.getId(), key -> new ConcurrentHashMap<>()) + .computeIfAbsent(error.getCode(), key2 -> new ConcurrentLinkedQueue<>()) + .add(error); + } + + public boolean hasErrors() { + return !errors.isEmpty(); + } + + public Set getErrorCodes() { + return errors.values().stream() + .flatMap(e -> e.keySet().stream()) + .collect(toUnmodifiableSet()); + } + } + + @Getter + @Accessors(chain = true) + final class Error { + + @Nonnull @JsonProperty private final ErrorCode code; + + /** The object that has the error */ + @Nonnull @JsonProperty private final String id; + + /** The type of the object identified by #id that has the error */ + @Nonnull @JsonProperty private final String type; + + /** + * The row index in the payload of the import. This is the index in the list of objects of a + * single type. This means the same index occurs for each object type. For some imports this + * information is not available. + */ + @CheckForNull @JsonProperty private final Integer index; + + /** The arguments used in the {@link #code}'s {@link ErrorCode#getMessage()} template */ + @Nonnull @JsonProperty private final List args; + + /** + * The message as created from {@link #code} and {@link #args}. This is only set in service + * layer for the web API using the setter, it is not persisted. + */ + @Setter + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private String message; + + @JsonCreator + public Error( + @Nonnull @JsonProperty("code") ErrorCode code, + @Nonnull @JsonProperty("id") String id, + @Nonnull @JsonProperty("type") String type, + @CheckForNull @JsonProperty("index") Integer index, + @Nonnull @JsonProperty("args") List args) { + this.code = code; + this.id = id; + this.type = type; + this.index = index; + this.args = args; } } @@ -641,7 +718,7 @@ public Process(String description) { this.stages = new ConcurrentLinkedDeque<>(); } - /** For recreation when de-serializing from string */ + /** For recreation when de-serializing from a JSON string */ @JsonCreator public Process( @JsonProperty("error") String error, diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobSchedulerService.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobSchedulerService.java index b04973be2ae1..43c276948491 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobSchedulerService.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobSchedulerService.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.scheduling; +import java.util.List; import java.util.Set; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -91,6 +92,9 @@ public interface JobSchedulerService { @CheckForNull Progress getProgress(@Nonnull String jobId); + @Nonnull + List getErrors(@Nonnull String jobId); + @CheckForNull Progress getRunningProgress(@Nonnull JobType type); diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java index 6a48216c8bde..7357c130c46c 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java @@ -112,7 +112,7 @@ public enum JobType { /* System Jobs */ - HEARTBEAT(every(20, "DHIS2rocks1", "Heartbeat")), + HOUSEKEEPING(every(20, "DHIS2rocks1", "Housekeeping")), DATA_SET_NOTIFICATION(daily2am("YvAwAmrqAtN", "Dataset notification")), CREDENTIALS_EXPIRY_ALERT(daily2am("sHMedQF7VYa", "Credentials expiry alert")), DATA_STATISTICS(daily2am("BFa3jDsbtdO", "Data statistics")), @@ -163,8 +163,8 @@ static Defaults dailyRandomBetween3and5(String uid, String name) { } } - private final Class jobParameters; - private final Defaults defaults; + @CheckForNull private final Class jobParameters; + @CheckForNull private final Defaults defaults; JobType() { this(null, null); @@ -178,7 +178,8 @@ static Defaults dailyRandomBetween3and5(String uid, String name) { this(null, defaults); } - JobType(Class jobParameters, Defaults defaults) { + JobType( + @CheckForNull Class jobParameters, @CheckForNull Defaults defaults) { this.jobParameters = jobParameters; this.defaults = defaults; } diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultQueryItemLocator.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultQueryItemLocator.java index b4872263141e..1346eba19c57 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultQueryItemLocator.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultQueryItemLocator.java @@ -34,10 +34,7 @@ import static org.hisp.dhis.common.DimensionalObject.ITEM_SEP; import static org.hisp.dhis.feedback.ErrorCode.E7224; -import java.util.Collections; -import java.util.Date; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.function.Supplier; import java.util.stream.Stream; import lombok.RequiredArgsConstructor; @@ -287,7 +284,7 @@ private static RepeatableStageParams getRepeatableStageParams(String dimension) return repeatableStageParams; } catch (InvalidRepeatableStageParamsException e) { - ErrorMessage errorMessage = new ErrorMessage(dimension, ErrorCode.E1101); + ErrorMessage errorMessage = new ErrorMessage(dimension, ErrorCode.E1101, List.of(dimension)); throw new IllegalQueryException(errorMessage); } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/config/StartupConfig.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/config/StartupConfig.java index f8cfa72e2cfb..b6f9f35dc659 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/config/StartupConfig.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/config/StartupConfig.java @@ -37,7 +37,6 @@ import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.period.PeriodStore; import org.hisp.dhis.period.PeriodTypePopulator; -import org.hisp.dhis.scheduling.JobConfigurationService; import org.hisp.dhis.scheduling.JobScheduler; import org.hisp.dhis.setting.SystemSettingManager; import org.hisp.dhis.startup.ConfigurationPopulator; @@ -124,9 +123,8 @@ public DefaultAdminUserPopulator defaultAdminUserPopulator(UserService userServi } @Bean - public SchedulerStart schedulerStart( - JobScheduler scheduler, JobConfigurationService jobConfigurationService) { - SchedulerStart schedulerStart = new SchedulerStart(scheduler, jobConfigurationService); + public SchedulerStart schedulerStart(JobScheduler scheduler) { + SchedulerStart schedulerStart = new SchedulerStart(scheduler); schedulerStart.setRunlevel(15); schedulerStart.setSkipInTests(true); return schedulerStart; diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/DefaultMessageService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/DefaultMessageService.java index 9b9902ddbed5..2f5e784151ba 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/DefaultMessageService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/message/DefaultMessageService.java @@ -60,6 +60,7 @@ import org.hisp.dhis.user.UserSettingService; import org.hisp.dhis.util.ObjectUtils; import org.joda.time.DateTime; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -209,8 +210,9 @@ public long sendMessage(MessageConversationParams params) { } @Override + @Async @Transactional - public long sendSystemErrorNotification(String subject, Throwable t) { + public void asyncSendSystemErrorNotification(@Nonnull String subject, @Nonnull Throwable t) { String title = systemSettingManager.getStringSetting(SettingKey.APPLICATION_TITLE); String baseUrl = configurationProvider.getServerBaseUrl(); @@ -232,7 +234,7 @@ public long sendSystemErrorNotification(String subject, Throwable t) { .withMessageType(MessageType.SYSTEM) .build(); - return sendMessage(params); + sendMessage(params); } @Override diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobConfigurationService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobConfigurationService.java index 45c3fb54417d..68b40d57e50f 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobConfigurationService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobConfigurationService.java @@ -131,7 +131,8 @@ public int createDefaultJobs() { int created = 0; Set jobIds = jobConfigurationStore.getAllIds(); for (JobType t : JobType.values()) { - if (t.getDefaults() != null && !jobIds.contains(t.getDefaults().uid())) { + Defaults defaults = t.getDefaults(); + if (defaults != null && !jobIds.contains(defaults.uid())) { createDefaultJob(t); created++; } @@ -141,18 +142,9 @@ public int createDefaultJobs() { @Override @Transactional - public void createHeartbeatJob() { - JobConfiguration config = jobConfigurationStore.getByUid(JobType.HEARTBEAT.getDefaults().uid()); - if (config == null) { - createDefaultJob(JobType.HEARTBEAT); - } else if (config.getJobStatus() != JobStatus.SCHEDULED) { - config.setJobStatus(JobStatus.SCHEDULED); - jobConfigurationStore.update(config); - } - } - - private void createDefaultJob(JobType type) { + public void createDefaultJob(JobType type) { Defaults job = type.getDefaults(); + if (job == null) return; JobConfiguration config = new JobConfiguration(job.name(), type); config.setCronExpression(job.cronExpression()); config.setDelay(job.delay()); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerLoopService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerLoopService.java index 1c8f9f4fd070..27c2aedb29fa 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerLoopService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerLoopService.java @@ -28,6 +28,7 @@ package org.hisp.dhis.scheduling; import static java.lang.String.format; +import static java.util.stream.Collectors.joining; import static org.hisp.dhis.eventhook.EventUtils.schedulerCompleted; import static org.hisp.dhis.eventhook.EventUtils.schedulerFailed; import static org.hisp.dhis.eventhook.EventUtils.schedulerStart; @@ -45,6 +46,7 @@ import lombok.extern.slf4j.Slf4j; import org.hisp.dhis.commons.util.DebugUtils; import org.hisp.dhis.eventhook.EventHookPublisher; +import org.hisp.dhis.feedback.ErrorCode; import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.leader.election.LeaderManager; import org.hisp.dhis.message.MessageService; @@ -83,6 +85,19 @@ public class DefaultJobSchedulerLoopService implements JobSchedulerLoopService { */ private final Map recordingsById = new ConcurrentHashMap<>(); + @Override + @Transactional + public void createHousekeepingJob() { + JobType.Defaults defaults = JobType.HOUSEKEEPING.getDefaults(); + if (defaults == null) return; + JobConfiguration config = jobConfigurationStore.getByUid(defaults.uid()); + if (config == null) { + jobConfigurationService.createDefaultJob(JobType.HOUSEKEEPING); + } else if (config.getJobStatus() != JobStatus.SCHEDULED) { + finishRunCancel(config.getUid()); + } + } + @Override @Transactional(readOnly = true) public int applyCancellation() { @@ -185,10 +200,18 @@ public void finishRunFail(@Nonnull String jobId, @CheckForNull Exception ex) { doSafely("fail", "log.error", () -> logError(message, ex)); doSafely("fail", "MDC.remove", () -> MDC.remove("sessionId")); doSafely("fail", "publishEvent", () -> events.publishEvent(schedulerFailed(job))); - doSafely( - "fail", - "sendSystemErrorNotification", - () -> messages.sendSystemErrorNotification(message, ex)); + Exception cause = ex; + if (cause == null) { + RecordingJobProgress progress = recordingsById.get(jobId); + if (progress != null) cause = progress.getCause(); + } + if (cause != null) { + Exception causeF = cause; + doSafely( + "fail", + "sendSystemErrorNotification", + () -> messages.asyncSendSystemErrorNotification(message, causeF)); + } skipRestOfQueue(job); } } @@ -260,9 +283,13 @@ private void updateProgress(@Nonnull String jobId) { RecordingJobProgress job = recordingsById.get(jobId); if (job == null) return; try { - jobConfigurationStore.updateProgress(jobId, jsonMapper.writeValueAsString(job.getProgress())); + JobProgress.Progress progress = job.getProgress(); + String errorCodes = + progress.getErrorCodes().stream().map(ErrorCode::name).collect(joining(" ")); + jobConfigurationStore.updateProgress( + jobId, jsonMapper.writeValueAsString(progress), errorCodes); } catch (JsonProcessingException ex) { - jobConfigurationStore.updateProgress(jobId, null); + jobConfigurationStore.updateProgress(jobId, null, null); log.error("Failed to attach progress json", ex); } } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerService.java index 0fa63bf64602..0fa7649de58d 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerService.java @@ -29,11 +29,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.Set; +import java.text.MessageFormat; +import java.util.*; import javax.annotation.Nonnull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.hisp.dhis.feedback.ConflictException; +import org.hisp.dhis.feedback.ErrorCode; import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.scheduling.JobProgress.Progress; import org.springframework.stereotype.Service; @@ -111,6 +113,25 @@ public Progress getProgress(@Nonnull String jobId) { return json == null ? null : mapToProgress(json); } + @Nonnull + @Override + @Transactional(readOnly = true) + public List getErrors(@Nonnull String jobId) { + String json = jobConfigurationStore.getErrors(jobId); + if (json == null) return List.of(); + Progress progress = mapToProgress("{\"sequence\":[],\"errors\":" + json + "}"); + if (progress == null) return List.of(); + Map>> map = progress.getErrors(); + if (map.isEmpty()) return List.of(); + List errors = + map.values().stream() + .flatMap(e -> e.values().stream().flatMap(Collection::stream)) + .toList(); + errors.forEach( + e -> e.setMessage(MessageFormat.format(e.getCode().getMessage(), e.getArgs().toArray()))); + return errors; + } + @Override @Transactional(readOnly = true) public Progress getRunningProgress(@Nonnull JobType type) { diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HeartbeatJob.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HeartbeatJob.java index 1d19bd425a51..ec3830ada9ee 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HeartbeatJob.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HeartbeatJob.java @@ -54,7 +54,7 @@ public class HeartbeatJob implements Job { @Override public JobType getJobType() { - return JobType.HEARTBEAT; + return JobType.HOUSEKEEPING; } @Override diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java index 5f39fee72d6b..be63df14bf74 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java @@ -97,12 +97,32 @@ public String getProgress(@Nonnull String jobId) { // language=SQL String sql = """ - select progress #>> '{}' from jobconfiguration + select + case jsonb_typeof(progress) + when 'object' then progress #>> '{}' + when 'array' then jsonb_build_object('sequence', progress) #>> '{}' + end + from jobconfiguration where uid = :id """; return getSingleResultOrNull(nativeQuery(sql).setParameter("id", jobId)); } + @Override + public String getErrors(@Nonnull String jobId) { + // language=SQL + String sql = + """ + select + case jsonb_typeof(progress) + when 'object' then progress #>> '{errors}' + end + from jobconfiguration + where uid = :id + """; + return getSingleResultOrNull(nativeQuery(sql).setParameter("id", jobId)); + } + @Override public Set getAllIds() { // language=SQL @@ -207,7 +227,6 @@ public Stream getDueJobConfigurations(boolean includeWaiting) where enabled = true and jobstatus = 'SCHEDULED' and (queueposition is null or queueposition = 0 or schedulingtype = 'ONCE_ASAP') - and (schedulingtype != 'ONCE_ASAP' or lastfinished is null) and (:waiting = true or not exists ( select 1 from jobconfiguration j2 where j2.jobtype = j1.jobtype @@ -351,17 +370,23 @@ public boolean trySkip(@Nonnull String queue) { } @Override - public void updateProgress(@Nonnull String jobId, @CheckForNull String progressJson) { + public void updateProgress( + @Nonnull String jobId, @CheckForNull String progressJson, @CheckForNull String errorCodes) { // language=SQL String sql = """ update jobconfiguration set - progress = to_jsonb(:json), - lastalive = case when jobstatus = 'RUNNING' then now() else lastalive end + lastalive = case when jobstatus = 'RUNNING' then now() else lastalive end, + errorcodes = :errors, + progress = cast(:json as jsonb) where uid = :id """; - nativeQuery(sql).setParameter("id", jobId).setParameter("json", progressJson).executeUpdate(); + nativeQuery(sql) + .setParameter("id", jobId) + .setParameter("json", progressJson) + .setParameter("errors", errorCodes) + .executeUpdate(); } @Override diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobScheduler.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobScheduler.java index 0ce4060b804d..5a81d5c5646d 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobScheduler.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobScheduler.java @@ -119,6 +119,9 @@ public void run() { .collect(groupingBy(JobConfiguration::getJobType)); // only attempt to start one per type per loop invocation readyByType.forEach((type, jobs) -> runIfDue(now, type, jobs)); + if (!readyByType.containsKey(JobType.HOUSEKEEPING)) { + createHousekeepingJob(); + } } } catch (Exception ex) { log.error("Exceptions thrown in scheduler loop", ex); @@ -126,6 +129,14 @@ public void run() { } } + private void createHousekeepingJob() { + try { + service.createHousekeepingJob(); + } catch (Exception ex) { + log.error("Unable to create house-keeping job: " + ex.getMessage()); + } + } + private void runIfDue(Instant now, JobType type, List jobs) { if (!type.isUsingContinuousExecution()) { runIfDue(now, jobs.get(0)); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobSchedulerLoopService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobSchedulerLoopService.java index 161aabedcf5a..0bc2d30f6d19 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobSchedulerLoopService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobSchedulerLoopService.java @@ -44,6 +44,12 @@ */ public interface JobSchedulerLoopService { + /** + * Make sure the {@link JobType#HOUSEKEEPING} entry exists as it is responsible for spawning the + * other system jobs when needed using {@link JobConfigurationService#createDefaultJobs()}. + */ + void createHousekeepingJob(); + /** * @return true, if node is or become the leader, else false */ diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/RecordingJobProgress.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/RecordingJobProgress.java index 9ede398504c7..2d0938b9ceb7 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/RecordingJobProgress.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/RecordingJobProgress.java @@ -32,10 +32,15 @@ import java.time.Duration; import java.util.Deque; +import java.util.List; import java.util.concurrent.CancellationException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.hisp.dhis.feedback.ErrorCode; import org.hisp.dhis.message.MessageService; import org.hisp.dhis.user.CurrentUserDetails; import org.hisp.dhis.user.CurrentUserUtil; @@ -62,7 +67,7 @@ public class RecordingJobProgress implements JobProgress { private final AtomicBoolean cancellationRequested = new AtomicBoolean(); private final AtomicBoolean abortAfterFailure = new AtomicBoolean(); private final AtomicBoolean skipCurrentStage = new AtomicBoolean(); - private final Progress progress = new Progress(); + @Getter private final Progress progress = new Progress(); private final AtomicReference incompleteProcess = new AtomicReference<>(); private final AtomicReference incompleteStage = new AtomicReference<>(); private final ThreadLocal incompleteItem = new ThreadLocal<>(); @@ -89,6 +94,15 @@ public RecordingJobProgress( messageService != null && configuration.getJobType().isUsingErrorNotification(); } + /** + * @return the exception that likely caused the job to abort + */ + @CheckForNull + public Exception getCause() { + Process process = progress.sequence.peekLast(); + return process == null ? null : process.getCause(); + } + public void requestCancellation() { if (cancellationRequested.compareAndSet(false, true)) { progress.sequence.forEach( @@ -99,10 +113,6 @@ public void requestCancellation() { } } - public Progress getProgress() { - return progress; - } - @Override public boolean isSuccessful() { autoComplete(); @@ -134,6 +144,21 @@ public boolean isSkipCurrentStage() { return skipCurrentStage.get() || isCancelled(); } + @Override + public void addError( + @Nonnull ErrorCode code, + @CheckForNull String uid, + @Nonnull String type, + @CheckForNull Integer index, + @Nonnull List args) { + try { + // Note: we use empty string in case the UID is not known/defined yet to allow use in maps + progress.addError(new Error(code, uid == null ? "" : uid, type, index, args)); + } catch (Exception ex) { + log.error("Failed to add error: %s %s %s %d %s".formatted(code, uid, type, index, args), ex); + } + } + @Override public void startingProcess(String description) { if (isCancelled()) { @@ -384,7 +409,7 @@ private void sendErrorNotification(Node node, Exception cause) { if (usingErrorNotification) { String subject = node.getClass().getSimpleName() + " failed: " + node.getDescription(); try { - messageService.sendSystemErrorNotification(subject, cause); + messageService.asyncSendSystemErrorNotification(subject, cause); } catch (Exception ex) { log.debug("Failed to send error notification for failed job processing"); } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/SchedulerStart.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/SchedulerStart.java index 59e3d3b9d2f0..3564eeceb0ce 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/SchedulerStart.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/SchedulerStart.java @@ -28,7 +28,6 @@ package org.hisp.dhis.startup; import lombok.RequiredArgsConstructor; -import org.hisp.dhis.scheduling.JobConfigurationService; import org.hisp.dhis.scheduling.JobScheduler; import org.hisp.dhis.system.startup.AbstractStartupRoutine; @@ -42,11 +41,9 @@ public class SchedulerStart extends AbstractStartupRoutine { private final JobScheduler scheduler; - private final JobConfigurationService jobConfigurationService; @Override public void execute() throws Exception { - jobConfigurationService.createHeartbeatJob(); scheduler.start(); } } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/scheduling/hibernate/JobConfiguration.hbm.xml b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/scheduling/hibernate/JobConfiguration.hbm.xml index ff08e5ef8673..d27693fbf591 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/scheduling/hibernate/JobConfiguration.hbm.xml +++ b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/scheduling/hibernate/JobConfiguration.hbm.xml @@ -67,5 +67,8 @@ + + + diff --git a/dhis-2/dhis-services/dhis-service-metadata-workflow/src/main/java/org/hisp/dhis/metadata/DefaultMetadataWorkflowService.java b/dhis-2/dhis-services/dhis-service-metadata-workflow/src/main/java/org/hisp/dhis/metadata/DefaultMetadataWorkflowService.java index 53316ce878a6..5bfe838e9709 100644 --- a/dhis-2/dhis-services/dhis-service-metadata-workflow/src/main/java/org/hisp/dhis/metadata/DefaultMetadataWorkflowService.java +++ b/dhis-2/dhis-services/dhis-service-metadata-workflow/src/main/java/org/hisp/dhis/metadata/DefaultMetadataWorkflowService.java @@ -27,12 +27,12 @@ */ package org.hisp.dhis.metadata; -import static java.util.Collections.singletonList; import static org.hisp.dhis.util.JsonUtils.jsonToObject; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Date; +import java.util.List; import javax.annotation.PostConstruct; import javax.persistence.NoResultException; import lombok.RequiredArgsConstructor; @@ -264,7 +264,7 @@ private ImportReport createImportReportWithError( ObjectReport objectReport = new ObjectReport(objType, null); ErrorReport errorReport = new ErrorReport(MetadataProposal.class, errorCode, args); errorReport.setErrorProperty(property); - errorReport.setErrorProperties(singletonList(property)); + errorReport.setErrorProperties(List.of(property)); objectReport.addErrorReport(errorReport); TypeReport typeReport = new TypeReport(objType); typeReport.addObjectReport(objectReport); diff --git a/dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/validation/scheduling/MonitoringJob.java b/dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/validation/scheduling/MonitoringJob.java index 988fb802beef..7b9cc8dc1b6d 100644 --- a/dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/validation/scheduling/MonitoringJob.java +++ b/dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/validation/scheduling/MonitoringJob.java @@ -106,7 +106,7 @@ public void execute(JobConfiguration config, JobProgress progress) { progress.completedProcess("Data validation done"); } catch (RuntimeException ex) { progress.failedProcess(ex); - messageService.sendSystemErrorNotification("Data validation failed", ex); + messageService.asyncSendSystemErrorNotification("Data validation failed", ex); throw ex; } } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/Error.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/Error.java index 1d6892504b35..4038def54b20 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/Error.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/Error.java @@ -31,9 +31,11 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Value; +import org.hisp.dhis.common.OpenApi; @Value @Builder +@OpenApi.Shared(name = "TrackerImportError") public class Error { private final String errorMessage; diff --git a/dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_32__job_configuation_errors_in_db.sql b/dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_32__job_configuation_errors_in_db.sql new file mode 100644 index 000000000000..1790def06a8d --- /dev/null +++ b/dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_32__job_configuation_errors_in_db.sql @@ -0,0 +1,11 @@ +-- adds error tracking to the job configuration table +-- this comes in two parts, the errors themself are added to the existing progress JSON object +-- the "index" of the errors, the list of error codes, from the full error description +-- is extracted and kept as a space seperated list in a new column "error_codes" +-- the column is null for row that existed before the feature and did not run since +-- the column is an empty string if there were no errors +-- the column is a list of error codes, like "E1100 E1105" if there where these error +-- list of error codes are always sorted by their number to allow combination searches using patterns + +alter table jobconfiguration + add column if not exists errorcodes text; \ No newline at end of file diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/metadata/MetadataImportJob.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/metadata/MetadataImportJob.java index ca4fa2bc080c..20c76b3ae303 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/metadata/MetadataImportJob.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/metadata/MetadataImportJob.java @@ -100,6 +100,18 @@ public void execute(JobConfiguration config, JobProgress progress) { progress.failedProcess("Import failed, no summary available"); return; } + + if (report.hasErrorReports()) { + report.forEachErrorReport( + r -> + progress.addError( + r.getErrorCode(), + r.getMainId(), + r.getMainKlass().getSimpleName(), + null, + r.getArgs())); + } + notifier.addJobSummary(config, report, ImportReport.class); Stats count = report.getStats(); Consumer endProcess = diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/scheduling/JobConfigurationController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/scheduling/JobConfigurationController.java index 032b494cf97d..085f7f97c01a 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/scheduling/JobConfigurationController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/scheduling/JobConfigurationController.java @@ -35,14 +35,18 @@ import org.hisp.dhis.common.IdentifiableObjects; import org.hisp.dhis.common.OpenApi; import org.hisp.dhis.feedback.ConflictException; +import org.hisp.dhis.feedback.ForbiddenException; import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.feedback.ObjectReport; import org.hisp.dhis.scheduling.JobConfiguration; import org.hisp.dhis.scheduling.JobConfigurationService; +import org.hisp.dhis.scheduling.JobProgress; import org.hisp.dhis.scheduling.JobProgress.Progress; import org.hisp.dhis.scheduling.JobSchedulerService; import org.hisp.dhis.schema.Property; import org.hisp.dhis.schema.descriptors.JobConfigurationSchemaDescriptor; +import org.hisp.dhis.user.CurrentUser; +import org.hisp.dhis.user.User; import org.hisp.dhis.webapi.controller.AbstractCrudController; import org.hisp.dhis.webapi.webdomain.JobTypes; import org.springframework.http.HttpStatus; @@ -108,15 +112,30 @@ public ObjectReport executeNow(@PathVariable("uid") String uid) @PostMapping("{uid}/cancel") @ResponseStatus(HttpStatus.NO_CONTENT) - public void cancelExecution(@PathVariable("uid") String uid) { + public void cancelExecution(@PathVariable("uid") String uid, @CurrentUser User currentUser) + throws NotFoundException, ForbiddenException { + JobConfiguration obj = jobConfigurationService.getJobConfigurationByUid(uid); + if (obj == null) throw new NotFoundException(JobConfiguration.class, uid); + boolean canCancel = + currentUser.isSuper() + || currentUser.isAuthorized("F_PERFORM_MAINTENANCE") + || currentUser.getUid().equals(obj.getExecutedBy()); + if (!canCancel) throw new ForbiddenException(JobConfiguration.class, obj.getUid()); jobSchedulerService.requestCancel(uid); } + @PreAuthorize("hasRole('ALL') or hasRole('F_PERFORM_MAINTENANCE')") @GetMapping("{uid}/progress") public Progress getProgress(@PathVariable("uid") String uid) { return jobSchedulerService.getProgress(uid); } + @PreAuthorize("hasRole('ALL') or hasRole('F_PERFORM_MAINTENANCE')") + @GetMapping("{uid}/errors") + public List getErrors(@PathVariable("uid") String uid) { + return jobSchedulerService.getErrors(uid); + } + @PreAuthorize("hasRole('ALL') or hasRole('F_PERFORM_MAINTENANCE')") @PostMapping("clean") @ResponseStatus(HttpStatus.NO_CONTENT) From 1a070248f6d0f99fdb6a22f13370644ecc26e3e5 Mon Sep 17 00:00:00 2001 From: David Mackessy <131455290+david-mackessy@users.noreply.github.com> Date: Wed, 8 Nov 2023 12:25:38 +0000 Subject: [PATCH 37/63] feature: Add ACL check when getting Datastore keys [DHIS2-15959] (#15595) * feature: Add failing tests before starting impl [DHIS2-15959] * feature: Add more failing tests [DHIS2-15959] * pause work to look at separate issue * feature: working on tests [DHIS2-15959] * feature: Small cleanup [DHIS2-15959] * feature: Fix existing tests [DHIS2-15959] * feature: clean up tests and add javadoc [DHIS2-15959] * feature: Add test for /namespace/keys endpoint [DHIS2-15959] * feature: Fix broken tests to reflect new behaviour [DHIS2-15959] * feature: Fix test and add another [DHIS2-15959] * feature: Use default public access of metadata read write. Update tests. [DHIS2-15959] * feature: Update javadoc [DHIS2-15959] * feature: Remove unnecessary comments in tests [DHIS2-15959] --- .../hisp/dhis/datastore/DatastoreStore.java | 6 +- .../hibernate/HibernateDatastoreStore.java | 18 +- .../org/hisp/dhis/query/JpaQueryUtils.java | 6 +- .../KeyJsonValueSchemaDescriptor.java | 1 + .../org/hisp/dhis/DhisConvenienceTest.java | 16 + .../hisp/dhis/datastore/DatastoreTest.java | 430 ++++++++++++++++++ .../datastore/DatastoreIntegrationTest.java | 6 +- .../dhis/datastore/DatastoreSharingTest.java | 381 ++++++++++++++++ ...storeControllerAndroidSettingsAppTest.java | 2 +- 9 files changed, 857 insertions(+), 9 deletions(-) create mode 100644 dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/datastore/DatastoreTest.java create mode 100644 dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/datastore/DatastoreSharingTest.java diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/datastore/DatastoreStore.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/datastore/DatastoreStore.java index 61420c293cf0..62f4beb82fc1 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/datastore/DatastoreStore.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/datastore/DatastoreStore.java @@ -54,7 +54,8 @@ public interface DatastoreStore extends IdentifiableObjectStore /** * Retrieves a list of keys associated with a given namespace which are updated after lastUpdated - * time. + * time. A sharing check for Metadata Read access is performed on the User to see what entries + * they have permission to read. * * @param namespace the namespace to retrieve keys from * @param lastUpdated the lastUpdated time to retrieve keys from @@ -71,7 +72,8 @@ public interface DatastoreStore extends IdentifiableObjectStore List getEntriesInNamespace(String namespace); /** - * Stream the matching entries to a transformer or consumer function. + * Stream the matching entries to a transformer or consumer function. A sharing check for Metadata + * Read access is performed on the User to see what entries they have permission to read. * *

Note that this API cannot return the {@link Stream} since it has to be processed within the * transaction bounds of the function call. For the same reason a transformer function has to diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/datastore/hibernate/HibernateDatastoreStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/datastore/hibernate/HibernateDatastoreStore.java index 42cd6a2d04f9..d60aecef6bbb 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/datastore/hibernate/HibernateDatastoreStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/datastore/hibernate/HibernateDatastoreStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2022, University of Oslo + * Copyright (c) 2004-2023, University of Oslo * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,6 +30,7 @@ import static java.util.Arrays.asList; import static java.util.Arrays.copyOfRange; import static java.util.Collections.emptyList; +import static org.hisp.dhis.query.JpaQueryUtils.generateHqlQueryForSharingCheck; import java.util.Date; import java.util.List; @@ -45,6 +46,7 @@ import org.hisp.dhis.datastore.DatastoreStore; import org.hisp.dhis.security.acl.AclService; import org.hisp.dhis.user.CurrentUserService; +import org.hisp.dhis.user.User; import org.springframework.context.ApplicationEventPublisher; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @@ -86,7 +88,12 @@ public List getKeysInNamespace(String namespace) { @Override public List getKeysInNamespace(String namespace, Date lastUpdated) { - String hql = "select key from DatastoreEntry where namespace = :namespace"; + User currentUser = currentUserService.getCurrentUser(); + String accessFilter = + generateHqlQueryForSharingCheck("ds", currentUser, AclService.LIKE_READ_METADATA); + + String hql = + "select key from DatastoreEntry ds where namespace = :namespace and " + accessFilter; if (lastUpdated != null) { hql += " and lastupdated >= :lastUpdated "; @@ -113,8 +120,13 @@ public List getEntriesInNamespace(String namespace) { @Override public T getEntries(DatastoreQuery query, Function, T> transform) { + User currentUser = currentUserService.getCurrentUser(); + String accessFilter = + generateHqlQueryForSharingCheck("ds", currentUser, AclService.LIKE_READ_METADATA); DatastoreQueryBuilder builder = - new DatastoreQueryBuilder("from DatastoreEntry where namespace = :namespace", query); + new DatastoreQueryBuilder( + "from DatastoreEntry ds where namespace = :namespace and " + accessFilter, query); + String hql = builder.createFetchHQL(); Query hQuery = diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/JpaQueryUtils.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/JpaQueryUtils.java index b36d1fa8e043..fb229c8c64c5 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/JpaQueryUtils.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/query/JpaQueryUtils.java @@ -397,13 +397,15 @@ private static String generateSQlQueryForSharingCheck(String groupsIds) { + "( %1$s, '%4$s', '%3$s') = true )"); } - public static String generateHqlQueryForSharingCheck(String tableName, User user, String access) { + public static String generateHqlQueryForSharingCheck( + String tableAlias, User user, String access) { if (user.isSuper() || user.isAuthorized("Test_skipSharingCheck")) { return "1=1"; } return "(" - + sqlToHql(tableName, generateSQlQueryForSharingCheck(tableName + ".sharing", user, access)) + + sqlToHql( + tableAlias, generateSQlQueryForSharingCheck(tableAlias + ".sharing", user, access)) + ")"; } diff --git a/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/descriptors/KeyJsonValueSchemaDescriptor.java b/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/descriptors/KeyJsonValueSchemaDescriptor.java index bee394c93e8b..fbed505a2df2 100644 --- a/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/descriptors/KeyJsonValueSchemaDescriptor.java +++ b/dhis-2/dhis-services/dhis-service-schema/src/main/java/org/hisp/dhis/schema/descriptors/KeyJsonValueSchemaDescriptor.java @@ -46,6 +46,7 @@ public Schema getSchema() { Schema schema = new Schema(DatastoreEntry.class, SINGULAR, PLURAL); schema.setRelativeApiEndpoint(API_ENDPOINT); schema.setOrder(9060); + schema.setShareable(true); return schema; } diff --git a/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java b/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java index ac5512fc916b..e18bedb2aab5 100644 --- a/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java +++ b/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/DhisConvenienceTest.java @@ -195,6 +195,7 @@ import org.hisp.dhis.user.UserRole; import org.hisp.dhis.user.UserService; import org.hisp.dhis.user.sharing.UserAccess; +import org.hisp.dhis.user.sharing.UserGroupAccess; import org.hisp.dhis.utils.Dxf2NamespaceResolver; import org.hisp.dhis.validation.ValidationRule; import org.hisp.dhis.validation.ValidationRuleGroup; @@ -2653,6 +2654,10 @@ protected void removeUserAccess(IdentifiableObject object) { object.getSharing().resetUserAccesses(); } + protected void removePublicAccess(IdentifiableObject object) { + object.getSharing().setPublicAccess("--------"); + } + protected void enableDataSharing(User user, IdentifiableObject object, String access) { object.getSharing().resetUserAccesses(); @@ -2663,6 +2668,17 @@ protected void enableDataSharing(User user, IdentifiableObject object, String ac object.getSharing().addUserAccess(userAccess); } + protected void enableDataSharingWithUserGroup( + UserGroup userGroup, IdentifiableObject object, String access) { + object.getSharing().resetUserGroupAccesses(); + + UserGroupAccess userGroupAccess = new UserGroupAccess(); + userGroupAccess.setUserGroup(userGroup); + userGroupAccess.setAccess(access); + + object.getSharing().addUserGroupAccess(userGroupAccess); + } + private static User createUser(String username, String uid) { User user = new User(); user.setCode(username); diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/datastore/DatastoreTest.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/datastore/DatastoreTest.java new file mode 100644 index 000000000000..daae825f1c0e --- /dev/null +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/datastore/DatastoreTest.java @@ -0,0 +1,430 @@ +/* + * Copyright (c) 2004-2023, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.datastore; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonArray; +import org.hisp.dhis.ApiTest; +import org.hisp.dhis.actions.LoginActions; +import org.hisp.dhis.actions.RestApiActions; +import org.hisp.dhis.actions.UserActions; +import org.hisp.dhis.dto.ApiResponse; +import org.hisp.dhis.helpers.QueryParamsBuilder; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +/** + * @author david mackessy + */ +class DatastoreTest extends ApiTest { + + private RestApiActions datastoreActions; + private RestApiActions sharingActions; + private LoginActions loginActions; + private UserActions userActions; + + private static final String NAMESPACE = "football"; + private static final String BASIC_USER = "User123"; + private String basicUserId = ""; + private String userGroupId = ""; + + @BeforeAll + public void beforeAll() { + datastoreActions = new RestApiActions("dataStore"); + sharingActions = new RestApiActions("sharing"); + loginActions = new LoginActions(); + userActions = new UserActions(); + basicUserId = userActions.addUser(BASIC_USER, "Test1234!"); + + RestApiActions userGroupActions = new RestApiActions("userGroups"); + userGroupId = userGroupActions.post("{\"name\":\"basic user group\"}").extractUid(); + } + + @AfterEach + public void deleteEntries() { + datastoreActions.delete(NAMESPACE).validateStatus(200); + } + + @Test + void testDatastoreSharing_DefaultPublicAccess_BasicUser() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // make call with fields query param as basic user and check can see 2 entries + loginActions.loginAsUser(BASIC_USER, "Test1234!"); + QueryParamsBuilder params = new QueryParamsBuilder().add("fields", "league"); + ApiResponse getResponse = datastoreActions.get("/" + NAMESPACE, params).validateStatus(200); + + JsonArray entries = getResponse.getBody().getAsJsonArray("entries"); + assertEquals("{\"key\":\"arsenal\",\"league\":\"prem\"}", entries.get(0).toString()); + assertEquals("{\"key\":\"spurs\",\"league\":\"prem\"}", entries.get(1).toString()); + assertEquals(2, entries.size()); + } + + @Test + void testDatastoreSharing_NoPublicAccess_SuperUser() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // get ids of entries + ApiResponse mdResponse1 = datastoreActions.get("/" + NAMESPACE + "/" + key1 + "/metaData"); + String uid1 = mdResponse1.extractUid(); + + // set sharing public access to '--------' + QueryParamsBuilder sharingParams = + new QueryParamsBuilder().add("type", "dataStore").add("id", uid1); + sharingActions.post("", sharingNoPublicAccess(), sharingParams).validateStatus(200); + + // make call with fields query param as super user and check can see 2 entries + loginActions.loginAsSuperUser(); + QueryParamsBuilder params = new QueryParamsBuilder().add("fields", "league"); + ApiResponse getResponse = datastoreActions.get("/" + NAMESPACE, params).validateStatus(200); + + JsonArray entries = getResponse.getBody().getAsJsonArray("entries"); + assertEquals("{\"key\":\"arsenal\",\"league\":\"prem\"}", entries.get(0).toString()); + assertEquals("{\"key\":\"spurs\",\"league\":\"prem\"}", entries.get(1).toString()); + assertEquals(2, entries.size()); + } + + @Test + void testDatastoreUserSharing_NoPublicAccess_UserNoAccess() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // get ids of entries + ApiResponse mdResponse1 = datastoreActions.get("/" + NAMESPACE + "/" + key1 + "/metaData"); + String uid1 = mdResponse1.extractUid(); + ApiResponse mdResponse2 = datastoreActions.get("/" + NAMESPACE + "/" + key2 + "/metaData"); + String uid2 = mdResponse2.extractUid(); + + // set sharing public access to '--------' + QueryParamsBuilder sharingParams1 = + new QueryParamsBuilder().add("type", "dataStore").add("id", uid1); + sharingActions.post("", sharingNoPublicAccess(), sharingParams1).validateStatus(200); + QueryParamsBuilder sharingParams2 = + new QueryParamsBuilder().add("type", "dataStore").add("id", uid2); + sharingActions.post("", sharingNoPublicAccess(), sharingParams2).validateStatus(200); + + // make call with fields query param as user with no access and check can see no entries + loginActions.loginAsUser(BASIC_USER, "Test1234!"); + + QueryParamsBuilder params = new QueryParamsBuilder().add("fields", "league"); + ApiResponse getResponse = datastoreActions.get("/" + NAMESPACE, params).validateStatus(200); + + JsonArray entries = getResponse.getBody().getAsJsonArray("entries"); + assertEquals(0, entries.size()); + } + + @Test + void testDatastoreUserSharing_NoPublicAccess_UserHasAccess() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // get ids of entries + ApiResponse mdResponse1 = datastoreActions.get("/" + NAMESPACE + "/" + key1 + "/metaData"); + String uid1 = mdResponse1.extractUid(); + ApiResponse mdResponse2 = datastoreActions.get("/" + NAMESPACE + "/" + key2 + "/metaData"); + String uid2 = mdResponse2.extractUid(); + + // share entries with user and set public access to '--------' + QueryParamsBuilder params = new QueryParamsBuilder().add("type", "dataStore").add("id", uid1); + sharingActions.post("", sharingUserAccess(basicUserId), params).validateStatus(200); + QueryParamsBuilder params2 = new QueryParamsBuilder().add("type", "dataStore").add("id", uid2); + sharingActions.post("", sharingUserAccess(basicUserId), params2).validateStatus(200); + + // make call with fields query param as user with access and check can see entries + loginActions.loginAsUser(BASIC_USER, "Test1234!"); + + QueryParamsBuilder fieldsParam = new QueryParamsBuilder().add("fields", "league"); + ApiResponse getResponse = datastoreActions.get("/" + NAMESPACE, fieldsParam); + + JsonArray entries = getResponse.getBody().getAsJsonArray("entries"); + assertEquals("{\"key\":\"arsenal\",\"league\":\"prem\"}", entries.get(0).toString()); + assertEquals("{\"key\":\"spurs\",\"league\":\"prem\"}", entries.get(1).toString()); + assertEquals(2, entries.size()); + } + + @Test + void testDatastoreUserSharing_NoPublicAccess_UserHasSomeAccess() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // get id of 1 entry + ApiResponse mdResponse1 = + datastoreActions.get("/" + NAMESPACE + "/" + key1 + "/metaData").validateStatus(200); + String uid1 = mdResponse1.extractUid(); + ApiResponse mdResponse2 = + datastoreActions.get("/" + NAMESPACE + "/" + key2 + "/metaData").validateStatus(200); + String uid2 = mdResponse2.extractUid(); + + // set no public access sharing on 1 entry + QueryParamsBuilder sharingParams1 = + new QueryParamsBuilder().add("type", "dataStore").add("id", uid1); + sharingActions.post("", sharingNoPublicAccess(), sharingParams1).validateStatus(200); + + // share other entry with user and set public access to '--------' + QueryParamsBuilder params = new QueryParamsBuilder().add("type", "dataStore").add("id", uid2); + sharingActions.post("", sharingUserAccess(basicUserId), params).validateStatus(200); + + // make call with fields query as user with some access and check can see 1 entry + loginActions.loginAsUser(BASIC_USER, "Test1234!"); + + QueryParamsBuilder fieldsParam = new QueryParamsBuilder().add("fields", "league"); + ApiResponse getResponse = + datastoreActions.get("/" + NAMESPACE, fieldsParam).validateStatus(200); + + JsonArray entries = getResponse.getBody().getAsJsonArray("entries"); + assertEquals("{\"key\":\"spurs\",\"league\":\"prem\"}", entries.get(0).toString()); + assertEquals(1, entries.size()); + } + + @Test + void testDatastoreUserGroupSharing_NoPublicAccess_UserHasAccess() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // get ids of entries + ApiResponse mdResponse1 = datastoreActions.get("/" + NAMESPACE + "/" + key1 + "/metaData"); + String uid1 = mdResponse1.extractUid(); + ApiResponse mdResponse2 = datastoreActions.get("/" + NAMESPACE + "/" + key2 + "/metaData"); + String uid2 = mdResponse2.extractUid(); + + // add user to user group + userActions.post(basicUserId + "/userGroups/" + userGroupId, "").validateStatus(200); + + // share entries with user group and set public access to '--------' + QueryParamsBuilder params = new QueryParamsBuilder().add("type", "dataStore").add("id", uid1); + sharingActions.post("", sharingUserGroupAccess(userGroupId), params).validateStatus(200); + QueryParamsBuilder params2 = new QueryParamsBuilder().add("type", "dataStore").add("id", uid2); + sharingActions.post("", sharingUserGroupAccess(userGroupId), params2).validateStatus(200); + + // make call with fields query as user with access and check can see all entries + loginActions.loginAsUser(BASIC_USER, "Test1234!"); + + QueryParamsBuilder fieldsParam = new QueryParamsBuilder().add("fields", "league"); + ApiResponse getResponse = + datastoreActions.get("/" + NAMESPACE, fieldsParam).validateStatus(200); + + JsonArray entries = getResponse.getBody().getAsJsonArray("entries"); + assertEquals("{\"key\":\"arsenal\",\"league\":\"prem\"}", entries.get(0).toString()); + assertEquals("{\"key\":\"spurs\",\"league\":\"prem\"}", entries.get(1).toString()); + assertEquals(2, entries.size()); + } + + @Test + void testDatastoreUserGroupSharing_NoPublicAccess_UserHasSomeAccess() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // get id of 1 entry + ApiResponse mdResponse1 = datastoreActions.get("/" + NAMESPACE + "/" + key1 + "/metaData"); + String uid1 = mdResponse1.extractUid(); + ApiResponse mdResponse2 = datastoreActions.get("/" + NAMESPACE + "/" + key2 + "/metaData"); + String uid2 = mdResponse2.extractUid(); + + // add user to user group + userActions.post(basicUserId + "/userGroups/" + userGroupId, "").validateStatus(200); + + // set no public access sharing on 1 entry + QueryParamsBuilder sharingParams = + new QueryParamsBuilder().add("type", "dataStore").add("id", uid2); + sharingActions.post("", sharingNoPublicAccess(), sharingParams).validateStatus(200); + + // give access to user for the other entry only and set public access to '--------' + QueryParamsBuilder params = new QueryParamsBuilder().add("type", "dataStore").add("id", uid1); + sharingActions.post("", sharingUserGroupAccess(userGroupId), params).validateStatus(200); + + // make call with fields query as user with some access and check can see 1 entry + loginActions.loginAsUser(BASIC_USER, "Test1234!"); + + QueryParamsBuilder fieldsParam = new QueryParamsBuilder().add("fields", "league"); + ApiResponse getResponse = + datastoreActions.get("/" + NAMESPACE, fieldsParam).validateStatus(200); + + JsonArray entries = getResponse.getBody().getAsJsonArray("entries"); + assertEquals("{\"key\":\"arsenal\",\"league\":\"prem\"}", entries.get(0).toString()); + assertEquals(1, entries.size()); + } + + @Test + void testDatastoreSharing_NoPublicAccess_UserNoAccess_KeysEndpoint() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // get ids of entries + ApiResponse mdResponse1 = datastoreActions.get("/" + NAMESPACE + "/" + key1 + "/metaData"); + String uid1 = mdResponse1.extractUid(); + ApiResponse mdResponse2 = datastoreActions.get("/" + NAMESPACE + "/" + key2 + "/metaData"); + String uid2 = mdResponse2.extractUid(); + + // set sharing public access to '--------' + QueryParamsBuilder sharingParams1 = + new QueryParamsBuilder().add("type", "dataStore").add("id", uid1); + sharingActions.post("", sharingNoPublicAccess(), sharingParams1).validateStatus(200); + QueryParamsBuilder sharingParams2 = + new QueryParamsBuilder().add("type", "dataStore").add("id", uid2); + sharingActions.post("", sharingNoPublicAccess(), sharingParams2).validateStatus(200); + + // make call as basic user with no access and check can see no entries + loginActions.loginAsUser(BASIC_USER, "Test1234!"); + ApiResponse getResponse = datastoreActions.get("/" + NAMESPACE + "/keys").validateStatus(200); + + String entries = getResponse.getAsString(); + assertEquals("[]", entries); + } + + @Test + void testDatastoreOwnerSharing_NoPublicAccess_UserHasAccess_KeysEndpoint() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // make call as owner and check can see entries + loginActions.loginAsUser(BASIC_USER, "Test1234!"); + ApiResponse getResponse = datastoreActions.get("/" + NAMESPACE + "/keys").validateStatus(200); + + String entries = getResponse.getAsString(); + assertEquals("[\"arsenal\",\"spurs\"]", entries); + } + + @Test + void testDatastoreUserSharing_DefaultPublicAccess_KeysEndpoint() { + // add 2 entries as admin + loginActions.loginAsAdmin(); + String key1 = "arsenal"; + String key2 = "spurs"; + datastoreActions.post("/" + NAMESPACE + "/" + key1, newEntry(key1)).validate().statusCode(201); + datastoreActions.post("/" + NAMESPACE + "/" + key2, newEntry(key2)).validate().statusCode(201); + + // make call as basic user and check can see entries + ApiResponse getResponse = datastoreActions.get("/" + NAMESPACE + "/keys").validateStatus(200); + + String entries = getResponse.getAsString(); + assertEquals("[\"arsenal\",\"spurs\"]", entries); + } + + private String newEntry(String team) { + return """ + {"name": "%s","league": "prem"} + """.strip().formatted(team); + } + + private String sharingUserAccess(String userId) { + return """ + { + "object": { + "publicAccess": "--------", + "externalAccess": false, + "user": {}, + "userAccesses": [ + { + "id": "%s", + "access": "r-------" + } + ], + "userGroupAccesses": [] + } + } + """ + .formatted(userId) + .strip(); + } + + private String sharingUserGroupAccess(String userGroupId) { + return """ + { + "object": { + "publicAccess": "--------", + "externalAccess": false, + "user": {}, + "userAccesses": [], + "userGroupAccesses": [ + { + "id": "%s", + "access": "r-------" + } + ] + } + } + """ + .formatted(userGroupId) + .strip(); + } + + private String sharingNoPublicAccess() { + return """ + { + "object": { + "publicAccess": "--------", + "externalAccess": false, + "user": {}, + "userAccesses": [], + "userGroupAccesses": [] + } + } + """ + .strip(); + } +} diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/datastore/DatastoreIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/datastore/DatastoreIntegrationTest.java index d54f4b68ffea..efc2847ed99a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/datastore/DatastoreIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/datastore/DatastoreIntegrationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2022, University of Oslo + * Copyright (c) 2004-2023, University of Oslo * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,6 +37,7 @@ import org.hisp.dhis.feedback.BadRequestException; import org.hisp.dhis.feedback.ConflictException; import org.hisp.dhis.test.integration.IntegrationTestBase; +import org.hisp.dhis.user.UserService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -55,9 +56,12 @@ */ class DatastoreIntegrationTest extends IntegrationTestBase { @Autowired private DatastoreService datastore; + @Autowired private UserService _userService; @Override protected void setUpTest() throws Exception { + this.userService = _userService; + createAndInjectAdminUser(); datastore.deleteNamespace("pets"); addEntry("dog", toJson(false)); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/datastore/DatastoreSharingTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/datastore/DatastoreSharingTest.java new file mode 100644 index 000000000000..7a62341ae7f0 --- /dev/null +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/datastore/DatastoreSharingTest.java @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2004-2023, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.datastore; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.UncheckedIOException; +import java.util.List; +import java.util.Set; +import org.hisp.dhis.feedback.BadRequestException; +import org.hisp.dhis.feedback.ConflictException; +import org.hisp.dhis.security.acl.AccessStringHelper; +import org.hisp.dhis.test.integration.SingleSetupIntegrationTestBase; +import org.hisp.dhis.user.CurrentUserDetails; +import org.hisp.dhis.user.CurrentUserUtil; +import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserGroup; +import org.hisp.dhis.user.UserGroupService; +import org.hisp.dhis.user.UserService; +import org.hisp.dhis.user.sharing.Sharing; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author david mackessy + */ +class DatastoreSharingTest extends SingleSetupIntegrationTestBase { + + @Autowired private DatastoreService datastoreService; + @Autowired private UserService _userService; + @Autowired private UserGroupService userGroupService; + @Autowired private ObjectMapper jsonMapper; + + private static final String NAMESPACE = "FOOTBALL"; + + @BeforeAll + public void init() { + this.userService = _userService; + } + + @Test + void testGetNamespaceKeys_DefaultPublicAccess() + throws ConflictException, BadRequestException, JsonProcessingException { + // given + // 2 existing namespace entries with default public sharing access 'rw------' + User basicUser = createAndAddUser(false, "basicUser", null); + + String arsenal = jsonMapper.writeValueAsString(club("arsenal")); + String spurs = jsonMapper.writeValueAsString(club("spurs")); + + addEntry("arsenal", arsenal); + addEntry("spurs", spurs); + + // when + // a basic user without explicit access tries to get namespace keys + injectSecurityContext(basicUser); + CurrentUserDetails currentUserDetails = CurrentUserUtil.getCurrentUserDetails(); + assertFalse(currentUserDetails.isSuper()); + assertEquals("basicUser", currentUserDetails.getUsername()); + List keysInNamespace = datastoreService.getKeysInNamespace(NAMESPACE, null); + + // then + // the basic user should be able to retrieve all keys from the namespace + assertNotNull(keysInNamespace); + assertEquals(2, keysInNamespace.size()); + assertTrue(keysInNamespace.containsAll(List.of("arsenal", "spurs"))); + } + + @Test + void testGetNamespaceKeys_NoPublicAccess_SuperUser() + throws ConflictException, BadRequestException, JsonProcessingException { + // given + // 2 existing namespace entries with no sharing public access + User superuser = createAndAddUser(true, "superUser1", null); + + String arsenal = jsonMapper.writeValueAsString(club("arsenal")); + String spurs = jsonMapper.writeValueAsString(club("spurs")); + + DatastoreEntry entry1 = addEntry("arsenal", arsenal); + DatastoreEntry entry2 = addEntry("spurs", spurs); + + removePublicAccess(entry1); + removePublicAccess(entry2); + + // when + // a superuser without explicit access tries to get namespace keys + injectSecurityContext(superuser); + CurrentUserDetails currentUserDetails = CurrentUserUtil.getCurrentUserDetails(); + assertTrue(currentUserDetails.isSuper()); + assertEquals("superUser1", currentUserDetails.getUsername()); + List keysInNamespace = datastoreService.getKeysInNamespace(NAMESPACE, null); + + // then + // the super user should be able to retrieve all keys from the namespace + assertNotNull(keysInNamespace); + assertEquals(2, keysInNamespace.size()); + assertTrue(keysInNamespace.containsAll(List.of("arsenal", "spurs"))); + } + + @Test + void testGetNamespaceKeys_NoPublicAccess_FullUserAccess() + throws ConflictException, BadRequestException, JsonProcessingException { + // given + // 2 existing namespace entries with sharing set to userWithFullAccess & no public access + User basicUser = createAndAddUser(false, "basicUser", null); + User userWithFullAccess = createAndAddUser(false, "userWithFullAccess", null); + injectSecurityContext(basicUser); + + String arsenal = jsonMapper.writeValueAsString(club("arsenal")); + String spurs = jsonMapper.writeValueAsString(club("spurs")); + + DatastoreEntry entry1 = addEntry("arsenal", arsenal); + DatastoreEntry entry2 = addEntry("spurs", spurs); + + removePublicAccess(entry1); + removePublicAccess(entry2); + + enableDataSharing(userWithFullAccess, entry1, "r-------"); + enableDataSharing(userWithFullAccess, entry2, "r-------"); + + // when + // a user with full access tries to get namespace keys + injectSecurityContext(userWithFullAccess); + CurrentUserDetails currentUserDetails = CurrentUserUtil.getCurrentUserDetails(); + assertFalse(currentUserDetails.isSuper()); + assertEquals("userWithFullAccess", currentUserDetails.getUsername()); + List keysInNamespace = datastoreService.getKeysInNamespace(NAMESPACE, null); + + // then + // the user should be able to retrieve all keys from the namespace + assertNotNull(keysInNamespace); + assertEquals(2, keysInNamespace.size()); + assertTrue(keysInNamespace.containsAll(List.of("arsenal", "spurs"))); + } + + @Test + void testGetNamespaceKeys_NoPublicAccess_NoUserAccess() + throws ConflictException, BadRequestException, JsonProcessingException { + // given + // 2 existing namespace entries with sharing set to basicUser only & no public access + User basicUser = createAndAddUser(false, "basicUser", null); + User userWithNoAccess = createAndAddUser(false, "userWithNoAccess", null); + injectSecurityContext(basicUser); + + String arsenal = jsonMapper.writeValueAsString(club("arsenal")); + String spurs = jsonMapper.writeValueAsString(club("spurs")); + + DatastoreEntry entry1 = addEntry("arsenal", arsenal); + DatastoreEntry entry2 = addEntry("spurs", spurs); + + removePublicAccess(entry1); + removePublicAccess(entry2); + + enableDataSharing(basicUser, entry1, "r-------"); + enableDataSharing(basicUser, entry2, "r-------"); + + // when + // a user with no explicit access tries to get namespace keys + injectSecurityContext(userWithNoAccess); + CurrentUserDetails currentUserDetails = CurrentUserUtil.getCurrentUserDetails(); + assertFalse(currentUserDetails.isSuper()); + assertEquals("userWithNoAccess", currentUserDetails.getUsername()); + List keysInNamespace = datastoreService.getKeysInNamespace(NAMESPACE, null); + + // then + // the user should not be able to retrieve any keys from the namespace + assertNotNull(keysInNamespace); + assertEquals(0, keysInNamespace.size()); + } + + @Test + void testGetNamespaceKeys_NoPublicAccess_UserAccessOnOneEntryOnly() + throws ConflictException, BadRequestException, JsonProcessingException { + // given + // 2 existing namespace entries with sharing set to nonSuperUser2 on 1 entry only + User basicUser = createAndAddUser(false, "basicUser", null); + User userWithSomeAccess = createAndAddUser(false, "userWithSomeAccess", null); + injectSecurityContext(basicUser); + + String arsenal = jsonMapper.writeValueAsString(club("arsenal")); + String spurs = jsonMapper.writeValueAsString(club("spurs")); + + DatastoreEntry entry1 = addEntry("arsenal", arsenal); + DatastoreEntry entry2 = addEntry("spurs", spurs); + + removePublicAccess(entry1); + removePublicAccess(entry2); + + enableDataSharing(userWithSomeAccess, entry1, "r-------"); + + // when + // a user with access to one entry tries to get namespace keys + injectSecurityContext(userWithSomeAccess); + CurrentUserDetails currentUserDetails = CurrentUserUtil.getCurrentUserDetails(); + assertFalse(currentUserDetails.isSuper()); + assertEquals("userWithSomeAccess", currentUserDetails.getUsername()); + List keysInNamespace = datastoreService.getKeysInNamespace(NAMESPACE, null); + + // then + // the user should be able to retrieve only one key from the namespace + assertNotNull(keysInNamespace); + assertEquals(1, keysInNamespace.size()); + } + + @Test + void testGetNamespaceKeys_NoPublicAccess_FullUserGroupAccess() + throws ConflictException, BadRequestException, JsonProcessingException { + // given + // 2 existing namespace entries with sharing set a specific user group only & no public access + User basicUser = createAndAddUser(false, "basicUser", null); + User userWithUserGroupAccess = createAndAddUser(false, "userWithUserGroupAccess", null); + UserGroup userGroup = createUserGroup('a', Set.of(userWithUserGroupAccess)); + userWithUserGroupAccess.getGroups().add(userGroup); + injectAdminUser(); + _userService.updateUser(userWithUserGroupAccess); + userGroupService.addUserGroup(userGroup); + injectSecurityContext(basicUser); + + String arsenal = jsonMapper.writeValueAsString(club("arsenal")); + String spurs = jsonMapper.writeValueAsString(club("spurs")); + + DatastoreEntry entry1 = addEntry("arsenal", arsenal); + DatastoreEntry entry2 = addEntry("spurs", spurs); + + removePublicAccess(entry1); + removePublicAccess(entry2); + + enableDataSharingWithUserGroup(userGroup, entry1, "r-------"); + enableDataSharingWithUserGroup(userGroup, entry2, "r-------"); + + // when + // a user with user group access tries to get namespace keys + injectSecurityContext(userWithUserGroupAccess); + CurrentUserDetails currentUserDetails = CurrentUserUtil.getCurrentUserDetails(); + assertFalse(currentUserDetails.isSuper()); + assertEquals("userWithUserGroupAccess", currentUserDetails.getUsername()); + List keysInNamespace = datastoreService.getKeysInNamespace(NAMESPACE, null); + + // then + // the user should be able to retrieve all keys from the namespace + assertNotNull(keysInNamespace); + assertEquals(2, keysInNamespace.size()); + assertTrue(keysInNamespace.containsAll(List.of("arsenal", "spurs"))); + } + + @Test + void testGetNamespaceKeys_NoPublicAccess_NoUserGroupAccess() + throws ConflictException, BadRequestException, JsonProcessingException { + // given + // 2 existing namespace entries with sharing set to a specific user group only & no public + // access + User basicUser = createAndAddUser(false, "basicUser", null); + User userWithNoAccess = createAndAddUser(false, "userWithNoAccess", null); + UserGroup userGroup = createUserGroup('a', Set.of(basicUser)); + injectAdminUser(); + userGroupService.addUserGroup(userGroup); + injectSecurityContext(basicUser); + + String arsenal = jsonMapper.writeValueAsString(club("arsenal")); + String spurs = jsonMapper.writeValueAsString(club("spurs")); + + DatastoreEntry entry1 = addEntry("arsenal", arsenal); + DatastoreEntry entry2 = addEntry("spurs", spurs); + + removePublicAccess(entry1); + removePublicAccess(entry2); + + enableDataSharingWithUserGroup(userGroup, entry1, "r-------"); + enableDataSharingWithUserGroup(userGroup, entry2, "r-------"); + + // when + // a user with no access tries to get namespace keys + injectSecurityContext(userWithNoAccess); + CurrentUserDetails currentUserDetails = CurrentUserUtil.getCurrentUserDetails(); + assertFalse(currentUserDetails.isSuper()); + assertEquals("userWithNoAccess", currentUserDetails.getUsername()); + List keysInNamespace = datastoreService.getKeysInNamespace(NAMESPACE, null); + + // then + // the user should not be able to retrieve any keys from the namespace + assertNotNull(keysInNamespace); + assertEquals(0, keysInNamespace.size()); + } + + @Test + void testGetNamespaceKeys_NoPublicAccess_UserGroupAccessOnOneEntryOnly() + throws ConflictException, BadRequestException, JsonProcessingException { + // given + // 2 existing namespace entries with sharing set to userWithSomeAccess on 1 entry only + User basicUser = createAndAddUser(false, "basicUser", null); + User userWithSomeAccess = createAndAddUser(false, "userWithSomeAccess", null); + UserGroup userGroup = createUserGroup('a', Set.of(userWithSomeAccess)); + userWithSomeAccess.getGroups().add(userGroup); + injectAdminUser(); + _userService.updateUser(userWithSomeAccess); + userGroupService.addUserGroup(userGroup); + injectSecurityContext(basicUser); + + String arsenal = jsonMapper.writeValueAsString(club("arsenal")); + String spurs = jsonMapper.writeValueAsString(club("spurs")); + + DatastoreEntry entry1 = addEntry("arsenal", arsenal); + DatastoreEntry entry2 = addEntry("spurs", spurs); + + removePublicAccess(entry1); + removePublicAccess(entry2); + + enableDataSharingWithUserGroup(userGroup, entry1, "r-------"); + + // when + // a user with group access for one entry tries to get namespace keys + injectSecurityContext(userWithSomeAccess); + CurrentUserDetails currentUserDetails = CurrentUserUtil.getCurrentUserDetails(); + assertFalse(currentUserDetails.isSuper()); + assertEquals("userWithSomeAccess", currentUserDetails.getUsername()); + List keysInNamespace = datastoreService.getKeysInNamespace(NAMESPACE, null); + + // then + // the user should be able to retrieve only one key from the namespace + assertNotNull(keysInNamespace); + assertEquals(1, keysInNamespace.size()); + } + + private DatastoreEntry addEntry(String key, T object) + throws ConflictException, BadRequestException { + DatastoreEntry entry = new DatastoreEntry(NAMESPACE, key, mapValueToJson(object), false); + entry.setSharing(Sharing.builder().publicAccess(AccessStringHelper.READ_WRITE).build()); + datastoreService.addEntry(entry); + return entry; + } + + private String mapValueToJson(T object) { + try { + return jsonMapper.writeValueAsString(object); + } catch (JsonProcessingException ex) { + throw new UncheckedIOException(ex); + } + } + + private String club(String club) { + return """ + { + "name": "%s", + "league": "prem" + } + """ + .formatted(club) + .strip(); + } +} diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/DatastoreControllerAndroidSettingsAppTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/DatastoreControllerAndroidSettingsAppTest.java index 652df889a7b2..434a1235cad5 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/DatastoreControllerAndroidSettingsAppTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/DatastoreControllerAndroidSettingsAppTest.java @@ -55,7 +55,7 @@ void setUp() { /** Everyone can read the keys */ @Test - void testGetKeysInNamespace() { + void testGetKeysInNamespace_DefaultPublicAccess() { switchToNewUser("not-an-android-manager"); assertEquals(singletonList("key"), GET("/dataStore/" + NAMESPACE).content().stringValues()); } From c5086feed0cb43e58d505839e7c3081c3c5be04a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 12:38:35 +0000 Subject: [PATCH 38/63] chore(deps): bump org.apache.maven.plugins:maven-surefire-plugin (#15620) Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.1...surefire-3.2.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 0a53dc254372..12b1d78e0732 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -225,7 +225,7 @@ 2.2 - 3.2.1 + 3.2.2 3.11.0 3.3.1 3.2.1 From 3e257266c74bcd2d4e415b0b72124a0f85391e71 Mon Sep 17 00:00:00 2001 From: Jan Bernitt Date: Wed, 8 Nov 2023 15:40:03 +0100 Subject: [PATCH 39/63] fix: remove renamed job from DB [DHIS2-15276] (#15628) --- .../db/migration/2.41/V2_41_34__job_configuration_rename.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_34__job_configuration_rename.sql diff --git a/dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_34__job_configuration_rename.sql b/dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_34__job_configuration_rename.sql new file mode 100644 index 000000000000..c43ed73137d1 --- /dev/null +++ b/dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_34__job_configuration_rename.sql @@ -0,0 +1,3 @@ +-- delete existing rows with the enum as it got renamed +-- a new row will be inserted automatically at startup +delete from jobconfiguration where jobtype = 'HEARTBEAT'; \ No newline at end of file From e3152baba97e98d14bb60435d3d5393b822a10f7 Mon Sep 17 00:00:00 2001 From: Giuseppe Nespolino Date: Wed, 8 Nov 2023 15:58:02 +0100 Subject: [PATCH 40/63] feat: add supports for !eq in dimension endpoint [DHIS2-13779] (#15627) * feat: add supports for !eq in dimension endpoint [DHIS2-13779] * feat: formatting [DHIS2-13779] --- .../webapi/dimension/DimensionFilters.java | 18 ++++---- .../dimension/DimensionFiltersTest.java | 46 +++++++++++-------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionFilters.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionFilters.java index 7909ef951ac8..94b2eaedf995 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionFilters.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionFilters.java @@ -34,10 +34,9 @@ import java.util.Objects; import java.util.Optional; import java.util.StringTokenizer; -import java.util.function.BiFunction; +import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Predicate; -import java.util.stream.Collectors; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; @@ -67,7 +66,7 @@ public static DimensionFilters of(Collection filterStrings) { .map(String::trim) .map(SingleFilter::of) .filter(Objects::nonNull) - .collect(Collectors.toList()); + .toList(); if (filters.isEmpty()) { return EMPTY_DATA_DIMENSION_FILTER; @@ -94,28 +93,27 @@ private static class SingleFilter implements Predicate { "displayName", DimensionResponse::getDisplayName, "displayShortName", DimensionResponse::getDisplayShortName); - private static final Map> OPERATOR_MAP = - new HashMap<>(); + private static final Map> OPERATOR_MAP = new HashMap<>(); static { putOperator("startsWith", String::startsWith, true); putOperator("endsWith", String::endsWith, true); - putOperator("eq", String::equals); + putOperator("eq", String::equals, true); putOperator("ieq", String::equalsIgnoreCase); putOperator("ne", (fv, v) -> !fv.equals(v)); putOperator("like", String::contains, true); putOperator("ilike", (fv, v) -> fv.toLowerCase().contains(v.toLowerCase()), true); } - private static void putOperator(String operator, BiFunction function) { + private static void putOperator(String operator, BiPredicate function) { putOperator(operator, function, false); } private static void putOperator( - String operator, BiFunction function, boolean negateAlso) { + String operator, BiPredicate function, boolean negateAlso) { OPERATOR_MAP.put(operator, function); if (negateAlso) { - OPERATOR_MAP.put("!" + operator, (s, s2) -> !function.apply(s, s2)); + OPERATOR_MAP.put("!" + operator, (s, s2) -> !function.test(s, s2)); } } @@ -153,7 +151,7 @@ public boolean test(DimensionResponse dimension) { private boolean applyOperator(String fieldValue) { return Optional.ofNullable(OPERATOR_MAP.get(operator)) - .map(operation -> operation.apply(fieldValue, value)) + .map(operation -> operation.test(fieldValue, value)) .orElse(false); } } diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/analytics/dimension/DimensionFiltersTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/analytics/dimension/DimensionFiltersTest.java index 6ba5de2f192a..7681702704c6 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/analytics/dimension/DimensionFiltersTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/analytics/dimension/DimensionFiltersTest.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.analytics.dimension; +import static org.apache.commons.lang3.tuple.Pair.of; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -47,6 +48,10 @@ class DimensionFiltersTest { + /** + * A map of all the fields in {@link DimensionResponse} and a function that creates a {@link + * DimensionResponse} with that field set to the given value. + */ private static final Map> BUILDER_MAP = Map.of( "id", s -> DimensionResponse.builder().id(s).build(), @@ -58,34 +63,36 @@ class DimensionFiltersTest { "displayName", s -> DimensionResponse.builder().displayName(s).build(), "displayShortName", s -> DimensionResponse.builder().displayShortName(s).build()); + public static final String STRING_TO_TEST_FILTER_ON = "TeSt"; + + /** + * A map of all the operators and the expected result of applying them to the {@link + * DimensionResponse} created by the corresponding {@link Function} in {@link #BUILDER_MAP} with + * the given {@link #STRING_TO_TEST_FILTER_ON}. The left value is the value to test for positive + * assertion, the right value is the value to test for negative. + */ private static final Map> OPERATORS = Stream.concat( Map.of( - "startsWith", Pair.of("Te", "eS"), - "!startsWith", Pair.of("eS", "Te"), - "endsWith", Pair.of("St", "eS"), - "!endsWith", Pair.of("eS", "St"), - "eq", Pair.of("TeSt", "tEsT"), - "ieq", Pair.of("test", "random")) + "startsWith", of("Te", "eS"), + "!startsWith", of("eS", "Te"), + "endsWith", of("St", "eS"), + "!endsWith", of("eS", "St"), + "eq", of("TeSt", "tEsT"), + "!eq", of("whatever", "TeSt"), + "ieq", of("test", "random")) .entrySet() .stream(), Map.of( - "ne", - Pair.of("random", "TeSt"), - "like", - Pair.of("eS", "es"), - "!like", - Pair.of("es", "eS"), - "ilike", - Pair.of("es", "et"), - "!ilike", - Pair.of("et", "es")) + "ne", of("random", "TeSt"), + "like", of("eS", "es"), + "!like", of("es", "eS"), + "ilike", of("es", "et"), + "!ilike", of("et", "es")) .entrySet() .stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - public static final String TEST_STRING = "TeSt"; - @Test void testDimensionFilterConstructor() { @@ -133,7 +140,8 @@ void testOperators() { @Test void testFieldsAndOperators() { - BUILDER_MAP.forEach((s, builder) -> assertAllOpsOnField(s, builder.apply(TEST_STRING))); + BUILDER_MAP.forEach( + (s, builder) -> assertAllOpsOnField(s, builder.apply(STRING_TO_TEST_FILTER_ON))); } private void assertAllOpsOnField(String fieldName, DimensionResponse response) { From 049e0408e58a8c64e254c019ecf285177013cd2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 08:28:53 +0100 Subject: [PATCH 41/63] chore(deps-dev): bump com.nimbusds:nimbus-jose-jwt in /dhis-2 (#15631) Bumps [com.nimbusds:nimbus-jose-jwt](https://bitbucket.org/connect2id/nimbus-jose-jwt) from 9.37 to 9.37.1. - [Changelog](https://bitbucket.org/connect2id/nimbus-jose-jwt/src/master/CHANGELOG.txt) - [Commits](https://bitbucket.org/connect2id/nimbus-jose-jwt/branches/compare/9.37.1..9.37) --- updated-dependencies: - dependency-name: com.nimbusds:nimbus-jose-jwt dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 12b1d78e0732..70d76d80b90a 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -99,7 +99,7 @@ 1.1.1.RELEASE 1.70 1.9.3 - 9.37 + 9.37.1 3.5.2 3.5.2 From 7ade8c772eedb09cdaa96cdc765457f21aba4d9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 09:34:32 +0100 Subject: [PATCH 42/63] chore(deps): bump com.github.spotbugs:spotbugs in /dhis-2 (#15632) Bumps [com.github.spotbugs:spotbugs](https://github.com/spotbugs/spotbugs) from 4.8.0 to 4.8.1. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.8.0...4.8.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 70d76d80b90a..ac33d71dda78 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -1901,7 +1901,7 @@ com.github.spotbugs spotbugs - 4.8.0 + 4.8.1 From dabf2c90addca726ac8b4581a7b36b23978d7066 Mon Sep 17 00:00:00 2001 From: Giuseppe Nespolino Date: Thu, 9 Nov 2023 12:04:43 +0100 Subject: [PATCH 43/63] fix: data_elements should be repeated for different stages [DHIS2-13779] (#15629) * fix: data_elements should be repeated for differente stages [DHIS2-13779] * test: test added [DHIS2-13779] * fix: e2e test [DHIS2-13779] * fix: e2e test [DHIS2-13779] --- .../src/main/resources/config.properties | 10 +-- .../analytics/AnalyticsDimensionsTest.java | 2 +- .../dimension/DimensionMapperService.java | 33 ++++++++- .../dimension/DimensionMapperServiceTest.java | 73 ++++++++++++++++--- 4 files changed, 97 insertions(+), 21 deletions(-) diff --git a/dhis-2/dhis-test-e2e/src/main/resources/config.properties b/dhis-2/dhis-test-e2e/src/main/resources/config.properties index 501690b5677c..3b92541dfef3 100644 --- a/dhis-2/dhis-test-e2e/src/main/resources/config.properties +++ b/dhis-2/dhis-test-e2e/src/main/resources/config.properties @@ -1,10 +1,10 @@ # property pointing to running DHIS2 instance. # must include /api -instance.url=http://localhost:8080/api +instance.url=http://localhost:8080/dhis/api # properties for user set up on the instance. # user must be able to import metadata. -user.default.username=system -user.default.password=System123 +user.default.username=admin +user.default.password=district # properties for super user set up on the instance. # default: user that has been set up when running tests user.super.username=tasuperadmin @@ -12,7 +12,7 @@ user.super.password=Test1212? user.admin.username=taadmin user.admin.password=Test1212? -test.cleanup=false -test.track_called_endpoints=false +test.cleanup=true +test.track_called_endpoints=true selenium.url=http://selenium:4444 diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/AnalyticsDimensionsTest.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/AnalyticsDimensionsTest.java index 2a24c5e97e46..c4f22d7960d6 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/AnalyticsDimensionsTest.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/analytics/AnalyticsDimensionsTest.java @@ -319,7 +319,7 @@ public void shouldReturnAllDataElements() { new QueryParamsBuilder().add("filter", "dimensionType:eq:DATA_ELEMENT")) .validate() .statusCode(200) - .body("dimensions", hasSize(equalTo(distinctDataElements.size()))) + .body("dimensions", hasSize(equalTo(dataElements.size()))) .body("dimensions.uid", everyItem(in(distinctDataElements))); } } diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionMapperService.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionMapperService.java index 6fb1adbafa31..e917ebc37d8a 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionMapperService.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/dimension/DimensionMapperService.java @@ -32,11 +32,14 @@ import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.UnaryOperator; +import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.RequiredArgsConstructor; import org.hisp.dhis.common.PrefixedDimension; import org.springframework.stereotype.Service; @@ -44,6 +47,8 @@ @Service @RequiredArgsConstructor public class DimensionMapperService { + + private static final String PROGRAM_ATTRIBUTE = "PROGRAM_ATTRIBUTE"; private final Collection mappers; public List toDimensionResponse( @@ -55,7 +60,7 @@ public List toDimensionResponse( Collection dimensions, PrefixStrategy prefixStrategy, boolean distinct) { UnaryOperator> distinctFunction = - distinct ? this::distinctByUid : UnaryOperator.identity(); + distinct ? this::distinctBy : UnaryOperator.identity(); return distinctFunction.apply( mapToList( @@ -63,8 +68,30 @@ public List toDimensionResponse( pDimension -> toDimensionResponse(pDimension, prefixStrategy.apply(pDimension)))); } - private List distinctByUid(List dimensionResponses) { - return dimensionResponses.stream().filter(distinctBy(DimensionResponse::getUid)).toList(); + private List distinctBy(List dimensionResponses) { + + // dimensionResponses by type + Map> byType = + dimensionResponses.stream() + .collect(Collectors.groupingBy(DimensionResponse::getDimensionType)); + + // we're gonna distinct by id (fully prefixed) for all whose type is not PROGRAM_ATTRIBUTE + Stream byId = + byType.keySet().stream() + .filter(k -> !k.equals(PROGRAM_ATTRIBUTE)) + .map(byType::get) + .flatMap(List::stream) + .filter(distinctBy(DimensionResponse::getId)); + + // we're gonna distinct by Uid for all whose type is PROGRAM_ATTRIBUTE + Stream programAttributes = + byType.keySet().stream() + .filter(k -> k.equals(PROGRAM_ATTRIBUTE)) + .map(byType::get) + .flatMap(List::stream) + .filter(distinctBy(DimensionResponse::getUid)); + + return Stream.concat(byId, programAttributes).toList(); } private static Predicate distinctBy(Function keyExtractor) { diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/dimension/DimensionMapperServiceTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/dimension/DimensionMapperServiceTest.java index 5ec514e47256..f4f66196fbf6 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/dimension/DimensionMapperServiceTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/dimension/DimensionMapperServiceTest.java @@ -35,10 +35,15 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.function.Supplier; import java.util.stream.Stream; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import org.hisp.dhis.common.BaseIdentifiableObject; -import org.hisp.dhis.common.DimensionType; import org.hisp.dhis.common.PrefixedDimension; +import org.hisp.dhis.program.Program; +import org.hisp.dhis.program.ProgramStage; +import org.hisp.dhis.program.ProgramStageDataElement; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.webapi.dimension.mappers.BaseDimensionalItemObjectMapper; import org.junit.jupiter.api.BeforeEach; @@ -56,19 +61,23 @@ void setUp() { } @Test - void testReturnedDimensionsHaveNoDuplicates() { + void testReturnedDimensionsHaveNoDuplicatesWhenProgramAttributes() { when(baseDimensionMapper.map(any(), any())) .thenAnswer( invocation -> { PrefixedDimension prefixedDimension = invocation.getArgument(0); - return DimensionResponse.builder().uid(prefixedDimension.getItem().getUid()).build(); + return DimensionResponse.builder() + .dimensionType(prefixedDimension.getDimensionType()) + .id(prefixedDimension.getPrefix() + "." + prefixedDimension.getItem().getUid()) + .uid(prefixedDimension.getItem().getUid()) + .build(); }); when(baseDimensionMapper.supports(any())).thenReturn(true); List dimensionResponse = dimensionMapperService.toDimensionResponse( - mockDimensions(), EnrollmentAnalyticsPrefixStrategy.INSTANCE, true); + mockDimensions(DimType.PROGRAM_ATTRIBUTE), TeiAnalyticsPrefixStrategy.INSTANCE, true); assertEquals(4, dimensionResponse.size()); @@ -78,21 +87,61 @@ void testReturnedDimensionsHaveNoDuplicates() { assertEquals(List.of("uid1", "uid2", "uid3", "repeated"), dimensionResponseUids); } - private Collection mockDimensions() { - return Stream.of("uid1", "uid2", "uid3", "repeated", "repeated") - .map(this::asPrefixedDimension) + @Test + void testReturnedDimensionsHaveDuplicatesWhenDataElements() { + + when(baseDimensionMapper.map(any(), any())) + .thenAnswer( + invocation -> { + PrefixedDimension prefixedDimension = invocation.getArgument(0); + return DimensionResponse.builder() + .dimensionType(prefixedDimension.getDimensionType()) + .id(prefixedDimension.getPrefix() + "." + prefixedDimension.getItem().getUid()) + .uid(prefixedDimension.getItem().getUid()) + .build(); + }); + when(baseDimensionMapper.supports(any())).thenReturn(true); + + List dimensionResponse = + dimensionMapperService.toDimensionResponse( + mockDimensions(DimType.DATA_ELEMENT), TeiAnalyticsPrefixStrategy.INSTANCE, true); + + assertEquals(5, dimensionResponse.size()); + + Collection dimensionResponseIds = + dimensionResponse.stream().map(DimensionResponse::getId).toList(); + + assertEquals( + List.of("p1.s1.uid1", "p1.s1.uid2", "p1.s1.uid3", "p1.s1.repeated", "p1.s2.repeated"), + dimensionResponseIds); + } + + @Getter + @RequiredArgsConstructor + private enum DimType { + PROGRAM_ATTRIBUTE(TrackedEntityAttribute::new), + DATA_ELEMENT(ProgramStageDataElement::new); + private final Supplier instanceSupplier; + } + + private Collection mockDimensions(DimType dimType) { + return Stream.of("p1.s1.uid1", "p1.s1.uid2", "p1.s1.uid3", "p1.s1.repeated", "p1.s2.repeated") + .map(uid -> asItem(uid, dimType)) .toList(); } - private PrefixedDimension asPrefixedDimension(String dimension) { + private PrefixedDimension asItem(String uid, DimType dimType) { + String[] split = uid.split("\\."); return PrefixedDimension.builder() - .item(buildItem(dimension)) - .dimensionType(DimensionType.PROGRAM_ATTRIBUTE.name()) + .program((Program) buildItem(split[0], Program::new)) + .programStage((ProgramStage) buildItem(split[1], ProgramStage::new)) + .item(buildItem(split[2], dimType.getInstanceSupplier())) + .dimensionType(dimType.name()) .build(); } - private BaseIdentifiableObject buildItem(String uid) { - TrackedEntityAttribute item = new TrackedEntityAttribute(); + private BaseIdentifiableObject buildItem(String uid, Supplier supplier) { + BaseIdentifiableObject item = supplier.get(); item.setUid(uid); return item; } From ae674bbb125180400b9caf0a74ab96db4463f82e Mon Sep 17 00:00:00 2001 From: Jan Bernitt Date: Fri, 10 Nov 2023 03:01:06 +0100 Subject: [PATCH 44/63] fix: run continuous jobs immediately [DHIS2-15276] (#15630) --- .../DefaultJobSchedulerService.java | 6 +++++ .../org/hisp/dhis/scheduling/JobRunner.java | 20 ++++++++++++++++ .../hisp/dhis/scheduling/JobScheduler.java | 23 ++++++++++++------- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerService.java index 0fa7649de58d..6a66f2e6f657 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/DefaultJobSchedulerService.java @@ -84,6 +84,12 @@ public void executeNow(@Nonnull String jobId) throws NotFoundException, Conflict if (job == null) throw new NotFoundException(JobConfiguration.class, jobId); // run "execute now" request directly when scheduling is not active (tests) jobRunner.runDueJob(job); + } else { + JobConfiguration job = jobConfigurationStore.getByUid(jobId); + if (job == null) throw new NotFoundException(JobConfiguration.class, jobId); + if (job.getJobType().isUsingContinuousExecution()) { + jobRunner.runIfDue(job); + } } } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobRunner.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobRunner.java index 5be683b59163..d137bf265d9f 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobRunner.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobRunner.java @@ -40,7 +40,27 @@ */ public interface JobRunner { + /** + * During testing the scheduler might not be active in which case this is false. Otherwise, this + * should always be true in a production environment. + * + * @return true, if the scheduler is running a scheduling loop cycle, otherwise false + */ boolean isScheduling(); + /** + * Runs a job if it should now run according to its {@link SchedulingType} and related information + * like the CRON expression or the delay time. + * + * @param config the job to check and potentially run + */ + void runIfDue(JobConfiguration config); + + /** + * Manually runs a job. OBS! This bypasses any actual checking if the job is due to run. When this + * is called the job will run. + * + * @param config The job to run. + */ void runDueJob(JobConfiguration config); } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobScheduler.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobScheduler.java index 5a81d5c5646d..c3583f06810f 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobScheduler.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/JobScheduler.java @@ -137,20 +137,27 @@ private void createHousekeepingJob() { } } + @Override + public void runIfDue(JobConfiguration job) { + runIfDue(Instant.now().truncatedTo(ChronoUnit.SECONDS), job.getJobType(), List.of(job)); + } + private void runIfDue(Instant now, JobType type, List jobs) { if (!type.isUsingContinuousExecution()) { runIfDue(now, jobs.get(0)); return; } - Queue jobIds = - continuousJobsByType.computeIfAbsent(type, key -> new ConcurrentLinkedQueue<>()); - // add a worker either if no worker is on it (empty new queue) or if there are many jobs - boolean spawnWorker = jobIds.isEmpty(); + Queue jobIds = continuousJobsByType.get(type); + boolean spawnWorker = false; + if (jobIds == null) { + Queue localQueue = new ConcurrentLinkedQueue<>(); + Queue sharedQueue = continuousJobsByType.putIfAbsent(type, localQueue); + spawnWorker = sharedQueue == null; // no previous queue => this thread put the queue + jobIds = continuousJobsByType.get(type); + } // add those IDs to the queue that are not yet in it - jobs.stream() - .map(JobConfiguration::getUid) - .filter(jobId -> !jobIds.contains(jobId)) - .forEach(jobIds::add); + jobs.stream().map(JobConfiguration::getUid).forEach(jobIds::add); + if (spawnWorker) { // we want to prevent starting more than one worker per job type // but if this does happen it is no issue as both will be pulling From e418388f6404312ede1b08cd9d179ebef4c2fabd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 08:20:16 +0100 Subject: [PATCH 45/63] chore(deps): bump org.apache.maven.plugins:maven-failsafe-plugin (#15637) Bumps [org.apache.maven.plugins:maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.1...surefire-3.2.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-failsafe-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index ac33d71dda78..cc19f9ef6b4e 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -228,7 +228,7 @@ 3.2.2 3.11.0 3.3.1 - 3.2.1 + 3.2.2 3.6.2 3.1.0 3.4.1 From dae330825b756f5c47fbfe869cfcd52722f1fee4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 08:20:34 +0100 Subject: [PATCH 46/63] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin in /dhis-2 (#15638) Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.7.3.6 to 4.8.1.0. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.7.3.6...spotbugs-maven-plugin-4.8.1.0) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index cc19f9ef6b4e..098d2f1aa577 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -236,7 +236,7 @@ 2.4.0 2.16.1 8.4.2 - 4.7.3.6 + 4.8.1.0 2.40.0 0.8.11 1.2.0 From 40cf7ad7984d0800722253f9dec7b4975baffd4d Mon Sep 17 00:00:00 2001 From: David Mackessy <131455290+david-mackessy@users.noreply.github.com> Date: Fri, 10 Nov 2023 12:04:42 +0000 Subject: [PATCH 47/63] fix: Remove unnecessary calls to the DB during DataValueSet import [DHIS2-16138] (#15639) * fix: Remove calls to DB during DataValueSet import [DHIS2-16138] * fix: Update tests to reflect the removal of DB interaction [DHIS2-16138] --- .../dxf2/datavalueset/DataValueSetImportValidator.java | 4 +--- .../datavalueset/DataValueSetImportValidatorTest.java | 8 +++----- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidator.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidator.java index 2e71592e11fb..cccdc7053c59 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidator.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidator.java @@ -351,9 +351,7 @@ private void validateDataValueOrgUnitInUserHierarchy( .getOrgUnitInHierarchyMap() .get( valueContext.getOrgUnit().getUid(), - () -> - organisationUnitService.isDescendant( - valueContext.getOrgUnit(), context.getCurrentOrgUnits())); + () -> valueContext.getOrgUnit().isDescendant(context.getCurrentOrgUnits())); if (!inUserHierarchy) { context.addConflict( diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidatorTest.java b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidatorTest.java index 4db3dd2d5ead..a4c87d0ef9ad 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidatorTest.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidatorTest.java @@ -110,11 +110,6 @@ void setUp() { approvalService = mock(DataApprovalService.class); dataValueService = mock(DataValueService.class); organisationUnitService = mock(OrganisationUnitService.class); - when(organisationUnitService.isDescendant(any(OrganisationUnit.class), any(Set.class))) - .thenReturn(true); - when(organisationUnitService.isDescendant( - any(OrganisationUnit.class), any(OrganisationUnit.class))) - .thenReturn(true); i18n = mock(I18n.class); validator = @@ -899,6 +894,9 @@ private DataValueContextBuilder createDataValueContext(DataValue dataValue) { if (ouId != null) { OrganisationUnit ou = new OrganisationUnit(); ou.setUid(ouId); + // we set the path here just for the tests. This is usually done by the persistence layer + // but there is no interaction with that in these tests. + ou.setPath(ou.getPath()); builder.orgUnit(ou); } if (coId != null) { From 5ad257bb67ff0562534dd13f8ab016c0524af9b1 Mon Sep 17 00:00:00 2001 From: lucaCambi77 Date: Fri, 10 Nov 2023 14:39:43 +0100 Subject: [PATCH 48/63] fix: tracker/events not returning event relationships [DHIS2-16117] (#15626) * fix: include relationships in event request mapper * fix: typo * fix: review * fix: formatting * fix: integration tests * fix: more integration tests --- .../export/event/EventOperationParams.java | 2 + .../event/EventOperationParamsMapper.java | 2 +- .../event/EventOperationParamsMapperTest.java | 29 ++++++++++-- .../org/hisp/dhis/tracker/TrackerApiTest.java | 43 ++++++----------- .../tracker/imports/TrackerExportTests.java | 30 +++++++++++- .../resources/setup/tracker_metadata.json | 35 ++++++++++++++ .../OrderAndPaginationExporterTest.java | 5 +- .../export/event/AclEventExporterTest.java | 46 +++++++++---------- .../export/event/EventExporterTest.java | 17 +++---- .../event/EventRequestParamsMapper.java | 5 +- .../event/EventRequestParamsMapperTest.java | 30 ++++++++++++ 11 files changed, 173 insertions(+), 71 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParams.java index b2d7afa8549c..2228d926a56c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParams.java @@ -147,6 +147,8 @@ public class EventOperationParams { private Set enrollments; + private EventParams eventParams; + public static class EventOperationParamsBuilder { private List order = new ArrayList<>(); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java index 5b6f0313c67d..58c41bfcd0c5 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapper.java @@ -146,7 +146,7 @@ public EventQueryParams map(EventOperationParams operationParams) .setEvents(operationParams.getEvents()) .setEnrollments(operationParams.getEnrollments()) .setIncludeDeleted(operationParams.isIncludeDeleted()) - .setIncludeRelationships(operationParams.isIncludeRelationships()); + .setIncludeRelationships(operationParams.getEventParams().isIncludeRelationships()); } private Program validateProgram(String programUid) throws BadRequestException { diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapperTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapperTest.java index 4941cb5e099a..d216d01f1299 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapperTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/event/EventOperationParamsMapperTest.java @@ -40,6 +40,7 @@ import static org.hisp.dhis.utils.Assertions.assertContainsOnly; import static org.hisp.dhis.utils.Assertions.assertStartsWith; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -153,7 +154,7 @@ public void setUp() { // By default set to ACCESSIBLE for tests that don't set an orgUnit. The orgUnitMode needs to be // set because its validation is in the EventRequestParamsMapper. - eventBuilder = eventBuilder.orgUnitMode(ACCESSIBLE); + eventBuilder = eventBuilder.orgUnitMode(ACCESSIBLE).eventParams(EventParams.FALSE); userMap.put("admin", createUserWithAuthority(F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS)); userMap.put("superuser", createUserWithAuthority(Authorities.ALL)); @@ -499,7 +500,7 @@ void shouldMapOrgUnitWhenProgramProvidedAndRequestedOrgUnitInSearchScope( .thenReturn(true); EventOperationParams operationParams = - EventOperationParams.builder() + eventBuilder .programUid(program.getUid()) .orgUnitUid(searchScopeChildOrgUnit.getUid()) .orgUnitMode(orgUnitMode) @@ -532,7 +533,7 @@ void shouldMapOrgUnitWhenModeAllProgramProvidedAndRequestedOrgUnitInSearchScope( .thenReturn(searchScopeChildOrgUnit); EventOperationParams operationParams = - EventOperationParams.builder() + eventBuilder .programUid(program.getUid()) .orgUnitUid(searchScopeChildOrgUnit.getUid()) .orgUnitMode(ALL) @@ -574,6 +575,28 @@ void shouldMapOrgUnitAndModeWhenModeAllAndUserIsAuthorized(String userName) assertEquals(ALL, params.getOrgUnitMode()); } + @Test + void shouldIncludeRelationshipsWhenFieldPathIncludeRelationships() + throws BadRequestException, ForbiddenException { + when(currentUserService.getCurrentUser()).thenReturn(userMap.get("admin")); + + EventOperationParams operationParams = + eventBuilder.orgUnitMode(ALL).eventParams(EventParams.TRUE).build(); + EventQueryParams params = mapper.map(operationParams); + assertTrue(params.isIncludeRelationships()); + } + + @Test + void shouldNotIncludeRelationshipsWhenFieldPathDoNotIncludeRelationships() + throws BadRequestException, ForbiddenException { + when(currentUserService.getCurrentUser()).thenReturn(userMap.get("admin")); + + EventOperationParams operationParams = + eventBuilder.orgUnitMode(ALL).eventParams(EventParams.FALSE).build(); + EventQueryParams params = mapper.map(operationParams); + assertFalse(params.isIncludeRelationships()); + } + private User createUserWithAuthority(Authorities authority) { User user = new User(); UserRole userRole = new UserRole(); diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/TrackerApiTest.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/TrackerApiTest.java index 3ca07fa7075b..c29794b34bb3 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/TrackerApiTest.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/TrackerApiTest.java @@ -91,20 +91,6 @@ protected String importTei() throws Exception { .get(0); } - protected String importTei(String orgUnit) throws Exception { - JsonObject teiBody = - new FileReaderUtils() - .read(new File("src/test/resources/tracker/importer/teis/tei.json")) - .replacePropertyValuesRecursivelyWith("orgUnit", orgUnit) - .get(JsonObject.class); - - return trackerImportExportActions - .postAndGetJobReport(teiBody) - .validateSuccessfulImport() - .extractImportedTeis() - .get(0); - } - protected List importEvents() throws Exception { JsonObject object = new FileReaderUtils() @@ -130,20 +116,6 @@ protected TrackerApiResponse importTeiWithEnrollment(String programId) throws Ex .validateSuccessfulImport(); } - protected TrackerApiResponse importTeiWithEnrollment(String ouId, String programId) - throws Exception { - JsonObject teiWithEnrollment = - new FileReaderUtils() - .read(new File("src/test/resources/tracker/importer/teis/teiWithEnrollments.json")) - .replacePropertyValuesRecursivelyWith("program", programId) - .replacePropertyValuesRecursivelyWith("orgUnit", ouId) - .get(JsonObject.class); - - return trackerImportExportActions - .postAndGetJobReport(teiWithEnrollment) - .validateSuccessfulImport(); - } - /* * Imports one new TEI with enrollment and event */ @@ -196,17 +168,28 @@ protected TrackerApiResponse importRelationshipBetweenTeis(String teiA, String t return trackerImportExportActions.postAndGetJobReport(payload).validateSuccessfulImport(); } - protected TrackerApiResponse importRelationshipEnrollmentToTei(String enrollment, String teiB) { + protected TrackerApiResponse importRelationshipEnrollmentToTei(String enrollment, String tei) { JsonObject payload = new RelationshipDataBuilder() .setFromEntity("enrollment", enrollment) - .setToTrackedEntity(teiB) + .setToTrackedEntity(tei) .setRelationshipType("fdc6uOvgoji") .array(); return trackerImportExportActions.postAndGetJobReport(payload).validateSuccessfulImport(); } + protected TrackerApiResponse importRelationshipEventToTei(String event, String tei) { + JsonObject payload = + new RelationshipDataBuilder() + .setFromEntity("event", event) + .setToTrackedEntity(tei) + .setRelationshipType("gdc6uOvgoji") + .array(); + + return trackerImportExportActions.postAndGetJobReport(payload).validateSuccessfulImport(); + } + @AfterEach public void tearDown() { loginActions.loginAsSuperUser(); diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/imports/TrackerExportTests.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/imports/TrackerExportTests.java index bd6b7ee403d4..4a1badd37aaa 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/imports/TrackerExportTests.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/tracker/imports/TrackerExportTests.java @@ -33,6 +33,7 @@ import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.emptyIterable; +import static org.hamcrest.Matchers.emptyOrNullString; import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.everyItem; @@ -88,6 +89,8 @@ public class TrackerExportTests extends TrackerApiTest { private static String enrollmentToTeiRelationship; + private static String eventToTeiRelationship; + private static JsonObject teiWithEnrollmentAndEventsTemplate; @BeforeAll @@ -103,12 +106,15 @@ public void beforeAll() throws Exception { enrollment = response.extractImportedEnrollments().get(0); + event = response.extractImportedEvents().get(0); + teiToTeiRelationship = importRelationshipBetweenTeis(teiA, teiB).extractImportedRelationships().get(0); enrollmentToTeiRelationship = importRelationshipEnrollmentToTei(enrollment, teiB).extractImportedRelationships().get(0); - event = response.extractImportedEvents().get(0); + eventToTeiRelationship = + importRelationshipEventToTei(event, teiB).extractImportedRelationships().get(0); teiWithEnrollmentAndEventsTemplate = new FileReaderUtils() @@ -425,6 +431,28 @@ public void shouldReturnRelationshipsByTei() { .body("to.trackedEntity.trackedEntity", equalTo(teiB)); } + @Test + public void shouldReturnRelationshipsWhenEventHasRelationshipsAndFieldsIncludeRelationships() { + trackerImportExportActions + .get("events?event=" + event + "&fields=relationships") + .validate() + .statusCode(200) + .body("instances", hasSize(greaterThanOrEqualTo(1))) + .rootPath("instances[0].relationships[0]") + .body("relationship", equalTo(eventToTeiRelationship)) + .body("from.event.event", equalTo(event)) + .body("to.trackedEntity.trackedEntity", equalTo(teiB)); + } + + @Test + public void shouldNotReturnRelationshipsWhenEventHasRelationshipsAndFieldsExcludeRelationships() { + trackerImportExportActions + .get("events?event=" + event) + .validate() + .statusCode(200) + .body("instances[0].relationships", emptyOrNullString()); + } + @Test public void shouldReturnFilteredEvent() { trackerImportExportActions diff --git a/dhis-2/dhis-test-e2e/src/test/resources/setup/tracker_metadata.json b/dhis-2/dhis-test-e2e/src/test/resources/setup/tracker_metadata.json index 610506d7199e..d42a466f6b17 100644 --- a/dhis-2/dhis-test-e2e/src/test/resources/setup/tracker_metadata.json +++ b/dhis-2/dhis-test-e2e/src/test/resources/setup/tracker_metadata.json @@ -3178,6 +3178,41 @@ } } } + }, + { + "lastUpdated": "2020-11-20T09:06:23.348", + "id": "gdc6uOvgoji", + "created": "2020-11-20T09:06:23.348", + "name": "Person to Event", + "code": "Person to Event", + "bidirectional": false, + "displayName": "Person to Event", + "fromToName": "Person to Event", + "displayFromToName": "Person to Event", + "favorite": false, + "toConstraint": { + "relationshipEntity": "TRACKED_ENTITY_INSTANCE", + "trackedEntityType": { + "id": "Q9GufDoplCL", + "code": "TA_PERSON_TET" + } + }, + "fromConstraint": { + "relationshipEntity": "PROGRAM_STAGE_INSTANCE", + "programStage": { + "id": "PaOOjwLVW23" + } + }, + "sharing": { + "public": "rw------", + "external": false, + "userGroups": { + "OPVIvvXzNTw": { + "id": "OPVIvvXzNTw", + "access": "rwrw----" + } + } + } } ] } \ No newline at end of file diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java index 6bbc9c6b9793..28c706005044 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java @@ -68,6 +68,7 @@ import org.hisp.dhis.tracker.export.enrollment.EnrollmentService; import org.hisp.dhis.tracker.export.event.EventOperationParams; import org.hisp.dhis.tracker.export.event.EventOperationParams.EventOperationParamsBuilder; +import org.hisp.dhis.tracker.export.event.EventParams; import org.hisp.dhis.tracker.export.event.EventService; import org.hisp.dhis.tracker.export.relationship.RelationshipOperationParams; import org.hisp.dhis.tracker.export.relationship.RelationshipService; @@ -125,7 +126,7 @@ void setUp() { // expect to be run by admin injectAdminUser(); - eventParamsBuilder = EventOperationParams.builder(); + eventParamsBuilder = EventOperationParams.builder().eventParams(EventParams.FALSE); eventParamsBuilder.orgUnitMode(SELECTED); } @@ -756,7 +757,7 @@ void shouldOrderEventsByEnrollmentProgramUIDAsc() throws ForbiddenException, Bad .toList(); EventOperationParams params = - EventOperationParams.builder() + eventParamsBuilder .orgUnitMode(ACCESSIBLE) .events(Set.of("pTzf9KYMk72", "QRYjLTiJTrA")) .orderBy("enrollment.program.uid", SortDirection.ASC) diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java index e9f6311b80e3..c2bd259a0c20 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java @@ -78,6 +78,8 @@ class AclEventExporterTest extends TrackerTest { private Program program; + private EventOperationParams.EventOperationParamsBuilder operationParamsBuilder; + @Override protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); @@ -102,6 +104,7 @@ void setUp() { // needed as some tests are run using another user (injectSecurityContext) while most tests // expect to be run by admin injectAdminUser(); + operationParamsBuilder = EventOperationParams.builder().eventParams(EventParams.FALSE); } @Test @@ -109,7 +112,7 @@ void shouldReturnEventsWhenProgramClosedOuModeDescendantsAndOrgUnitInCaptureScop throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .programUid("pcxIanBWlSY") .orgUnitUid(orgUnit.getUid()) .orgUnitMode(DESCENDANTS) @@ -135,10 +138,7 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeDescendantsAndOrgUnitInSearch throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder() - .orgUnitUid(orgUnit.getUid()) - .orgUnitMode(DESCENDANTS) - .build(); + operationParamsBuilder.orgUnitUid(orgUnit.getUid()).orgUnitMode(DESCENDANTS).build(); List events = eventService.getEvents(params); @@ -162,7 +162,7 @@ void shouldReturnEventsWhenProgramClosedOuModeChildrenAndOrgUnitInCaptureScope() throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .programUid("pcxIanBWlSY") .orgUnitUid(orgUnit.getUid()) .orgUnitMode(CHILDREN) @@ -188,7 +188,7 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeChildrenAndOrgUnitInSearchSco throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder().orgUnitUid(orgUnit.getUid()).orgUnitMode(CHILDREN).build(); + operationParamsBuilder.orgUnitUid(orgUnit.getUid()).orgUnitMode(CHILDREN).build(); List events = eventService.getEvents(params); @@ -204,7 +204,7 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeChildrenAndOrgUnitInSearchSco void shouldFailWhenProgramIsOpenAndOrgUnitNotInSearchScope() { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .programUid(program.getUid()) .orgUnitUid("DiszpKrYNg8") .orgUnitMode(DESCENDANTS) @@ -220,7 +220,7 @@ void shouldFailWhenProgramIsOpenAndOrgUnitNotInSearchScope() { void shouldFailWhenProgramIsClosedAndOrgUnitNotInSearchScope() { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .programUid("pcxIanBWlSY") .orgUnitUid("DiszpKrYNg8") .orgUnitMode(DESCENDANTS) @@ -237,7 +237,7 @@ void shouldReturnEventsWhenProgramClosedOuModeSelectedAndOrgUnitInCaptureScope() throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .programUid("pcxIanBWlSY") .orgUnitUid("uoNW0E3xXUy") .orgUnitMode(SELECTED) @@ -263,7 +263,7 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeSelectedAndOrgUnitInSearchSco throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("nIidJVYpQQK")); EventOperationParams params = - EventOperationParams.builder().orgUnitUid("DiszpKrYNg8").orgUnitMode(SELECTED).build(); + operationParamsBuilder.orgUnitUid("DiszpKrYNg8").orgUnitMode(SELECTED).build(); List events = eventService.getEvents(params); @@ -281,7 +281,7 @@ void shouldReturnEventsWhenNoProgramSpecifiedOuModeSelectedAndOrgUnitInCaptureSc throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder().orgUnitUid("RojfDTBhoGC").orgUnitMode(SELECTED).build(); + operationParamsBuilder.orgUnitUid("RojfDTBhoGC").orgUnitMode(SELECTED).build(); List events = eventService.getEvents(params); @@ -299,7 +299,7 @@ void shouldReturnNoEventsWhenProgramOpenOuModeSelectedAndNoProgramEvents() throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .programUid("shPjYNifvMK") .orgUnitUid(orgUnit.getUid()) .orgUnitMode(SELECTED) @@ -315,7 +315,7 @@ void shouldReturnEventsWhenProgramClosedOuModeAccessible() throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder().programUid("pcxIanBWlSY").orgUnitMode(ACCESSIBLE).build(); + operationParamsBuilder.programUid("pcxIanBWlSY").orgUnitMode(ACCESSIBLE).build(); List events = eventService.getEvents(params); @@ -336,7 +336,7 @@ void shouldReturnEventsWhenProgramOpenOuModeAccessible() throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder().programUid(program.getUid()).orgUnitMode(ACCESSIBLE).build(); + operationParamsBuilder.programUid(program.getUid()).orgUnitMode(ACCESSIBLE).build(); List events = eventService.getEvents(params); @@ -357,7 +357,7 @@ void shouldReturnEventsWhenProgramClosedOuModeCapture() throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder().programUid("pcxIanBWlSY").orgUnitMode(CAPTURE).build(); + operationParamsBuilder.programUid("pcxIanBWlSY").orgUnitMode(CAPTURE).build(); List events = eventService.getEvents(params); @@ -378,7 +378,7 @@ void shouldReturnAccessibleOrgUnitEventsWhenNoOrgUnitSpecified() throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("FIgVWzUCkpw")); EventOperationParams params = - EventOperationParams.builder().programUid("pcxIanBWlSY").orgUnitMode(ACCESSIBLE).build(); + operationParamsBuilder.programUid("pcxIanBWlSY").orgUnitMode(ACCESSIBLE).build(); List events = eventService.getEvents(params); @@ -403,7 +403,7 @@ void shouldReturnEventsNonSuperUserIsOwnerOrHasUserAccess() injectSecurityContext(userService.getUser("o1HMTIzBGo7")); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .orgUnitUid("DiszpKrYNg8") .orgUnitMode(SELECTED) .events(Set.of("lumVtWwwy0O", "cadc5eGj0j7")) @@ -437,7 +437,7 @@ void shouldReturnNoEventsGivenUserHasNoAccess() throws ForbiddenException, BadRe injectSecurityContext(userService.getUser("CYVgFNKCaUS")); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .orgUnitUid("DiszpKrYNg8") .orgUnitMode(SELECTED) .events(Set.of("lumVtWwwy0O", "cadc5eGj0j7")) @@ -453,7 +453,7 @@ void shouldReturnAllEventsWhenOrgUnitModeAllAndNoOrgUnitProvided() throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("lPaILkLkgOM")); - EventOperationParams params = EventOperationParams.builder().orgUnitMode(ALL).build(); + EventOperationParams params = operationParamsBuilder.orgUnitMode(ALL).build(); List events = eventService.getEvents(params); @@ -476,7 +476,7 @@ void shouldReturnAllEventsWhenOrgUnitModeAllAndNoOrgUnitProvidedAndUserNull() throws ForbiddenException, BadRequestException { injectSecurityContext(null); - EventOperationParams params = EventOperationParams.builder().orgUnitMode(ALL).build(); + EventOperationParams params = operationParamsBuilder.orgUnitMode(ALL).build(); List events = eventService.getEvents(params); @@ -500,7 +500,7 @@ void shouldIgnoreRequestedOrgUnitAndReturnAllEventsWhenOrgUnitModeAllAndOrgUnitP injectSecurityContext(userService.getUser("lPaILkLkgOM")); EventOperationParams params = - EventOperationParams.builder().orgUnitUid("uoNW0E3xXUy").orgUnitMode(ALL).build(); + operationParamsBuilder.orgUnitUid("uoNW0E3xXUy").orgUnitMode(ALL).build(); List events = eventService.getEvents(params); @@ -524,7 +524,7 @@ void shouldIgnoreRequestedOrgUnitAndReturnAllEventsWhenOrgUnitModeAllAndOrgUnitP throws ForbiddenException, BadRequestException { injectSecurityContext(userService.getUser("nIidJVYpQQK")); - EventOperationParams params = EventOperationParams.builder().orgUnitMode(ACCESSIBLE).build(); + EventOperationParams params = operationParamsBuilder.orgUnitMode(ACCESSIBLE).build(); List events = eventService.getEvents(params); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java index d8a74b448dd2..33ebe1e366ef 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java @@ -130,7 +130,7 @@ void setUp() { // expect to be run by admin injectAdminUser(); - operationParamsBuilder = EventOperationParams.builder(); + operationParamsBuilder = EventOperationParams.builder().eventParams(EventParams.FALSE); operationParamsBuilder.orgUnitUid(orgUnit.getUid()).orgUnitMode(SELECTED); } @@ -152,7 +152,7 @@ void shouldExportEventAndMapAssignedUserWhenAssignedUserIsNotNull() @Test void shouldReturnEventsWithRelationships() throws ForbiddenException, BadRequestException { EventOperationParams params = - operationParamsBuilder.events(Set.of("pTzf9KYMk72")).includeRelationships(true).build(); + operationParamsBuilder.events(Set.of("pTzf9KYMk72")).eventParams(EventParams.TRUE).build(); List events = eventService.getEvents(params); @@ -262,10 +262,7 @@ void testExportEventsWithLastUpdateDates() throws ForbiddenException, BadRequest void testExportEventsWithDatesIncludingTimeStamp() throws ForbiddenException, BadRequestException { EventOperationParams params = - EventOperationParams.builder() - .orgUnitMode(ACCESSIBLE) - .events(Set.of("pTzf9KYMk72")) - .build(); + operationParamsBuilder.orgUnitMode(ACCESSIBLE).events(Set.of("pTzf9KYMk72")).build(); List events = eventService.getEvents(params); @@ -414,7 +411,7 @@ void testExportEventsWhenFilteringByDataElementsWithCategoryOptionSuperUser() @Test void shouldReturnEventsGivenCategoryOptionCombo() throws ForbiddenException, BadRequestException { EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .orgUnitUid("DiszpKrYNg8") .orgUnitMode(SELECTED) .attributeCategoryCombo("O4VaNks6tta") @@ -450,7 +447,7 @@ void shouldFailIfCategoryOptionComboOfGivenEventDoesNotHaveAValueForGivenIdSchem IdSchemes idSchemes = new IdSchemes(); idSchemes.setCategoryOptionComboIdScheme("ATTRIBUTE:GOLswS44mh8"); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .orgUnitUid("DiszpKrYNg8") .orgUnitMode(SELECTED) .idSchemes(idSchemes) @@ -472,7 +469,7 @@ void shouldReturnEventsGivenIdSchemeCode() throws ForbiddenException, BadRequest idSchemes.setCategoryOptionComboIdScheme("code"); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .orgUnitUid("DiszpKrYNg8") .orgUnitMode(SELECTED) .idSchemes(idSchemes) @@ -523,7 +520,7 @@ void shouldReturnEventsGivenIdSchemeAttribute() throws ForbiddenException, BadRe idSchemes.setOrgUnitIdScheme("ATTRIBUTE:j45AR9cBQKc"); idSchemes.setCategoryOptionComboIdScheme("ATTRIBUTE:j45AR9cBQKc"); EventOperationParams params = - EventOperationParams.builder() + operationParamsBuilder .orgUnitUid("DiszpKrYNg8") .orgUnitMode(SELECTED) .idSchemes(idSchemes) diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapper.java index 4a6fa703a003..b15543bc46f2 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapper.java @@ -59,6 +59,8 @@ class EventRequestParamsMapper { private static final Set ORDERABLE_FIELD_NAMES = EventMapper.ORDERABLE_FIELDS.keySet(); + private final EventFieldsParamMapper eventsMapper; + public EventOperationParams map(RequestParams requestParams) throws BadRequestException { OrganisationUnitSelectionMode orgUnitMode = validateDeprecatedParameter( @@ -144,7 +146,8 @@ public EventOperationParams map(RequestParams requestParams) throws BadRequestEx .attributeFilters(attributeFilters) .events(UID.toValueSet(eventUids)) .enrollments(UID.toValueSet(requestParams.getEnrollments())) - .includeDeleted(requestParams.isIncludeDeleted()); + .includeDeleted(requestParams.isIncludeDeleted()) + .eventParams(eventsMapper.map(requestParams.getFields())); mapOrderParam(builder, requestParams.getOrder()); diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java index 7099161a8708..5de64f36a3b0 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/export/event/EventRequestParamsMapperTest.java @@ -34,6 +34,7 @@ import static org.hisp.dhis.utils.Assertions.assertContainsOnly; import static org.hisp.dhis.utils.Assertions.assertIsEmpty; import static org.hisp.dhis.utils.Assertions.assertStartsWith; +import static org.hisp.dhis.webapi.controller.tracker.export.FieldsParamMapper.FIELD_RELATIONSHIPS; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -55,6 +56,8 @@ import org.hisp.dhis.dataelement.DataElement; import org.hisp.dhis.dataelement.DataElementService; import org.hisp.dhis.feedback.BadRequestException; +import org.hisp.dhis.fieldfiltering.FieldFilterParser; +import org.hisp.dhis.fieldfiltering.FieldPath; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.program.Program; @@ -68,6 +71,7 @@ import org.hisp.dhis.trackedentity.TrackedEntityService; import org.hisp.dhis.tracker.export.Order; import org.hisp.dhis.tracker.export.event.EventOperationParams; +import org.hisp.dhis.tracker.export.event.EventParams; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; import org.hisp.dhis.webapi.controller.event.mapper.SortDirection; @@ -113,6 +117,8 @@ class EventRequestParamsMapperTest { @Mock private DataElementService dataElementService; + @Mock EventFieldsParamMapper eventFieldsParamMapper; + @InjectMocks private EventRequestParamsMapper mapper; private Program program; @@ -589,4 +595,28 @@ void shouldFailWhenNoOrgUnitSuppliedAndOrgUnitModeNeedsOrgUnit( "At least one org unit is required for orgUnitMode: " + orgUnitMode, exception.getMessage()); } + + @Test + void shouldMapEventParamsTrueWhenFieldPathIncludeRelationships() throws BadRequestException { + RequestParams requestParams = new RequestParams(); + List fieldPaths = FieldFilterParser.parse(FIELD_RELATIONSHIPS); + + requestParams.setFields(fieldPaths); + when(eventFieldsParamMapper.map(fieldPaths)).thenReturn(EventParams.TRUE); + + EventOperationParams eventOperationParams = mapper.map(requestParams); + assertEquals(EventParams.TRUE, eventOperationParams.getEventParams()); + } + + @Test + void shouldMapEventParamsFalseWhenFieldPathIncludeRelationships() throws BadRequestException { + RequestParams requestParams = new RequestParams(); + List fieldPaths = FieldFilterParser.parse(FIELD_RELATIONSHIPS); + + requestParams.setFields(fieldPaths); + when(eventFieldsParamMapper.map(fieldPaths)).thenReturn(EventParams.FALSE); + + EventOperationParams eventOperationParams = mapper.map(requestParams); + assertEquals(EventParams.FALSE, eventOperationParams.getEventParams()); + } } From 37ba2183b831e558d6fef1afbe0239f72121e886 Mon Sep 17 00:00:00 2001 From: Enrico Colasante Date: Fri, 10 Nov 2023 16:10:14 +0100 Subject: [PATCH 49/63] chore: Rename duedate to scheduleddate in DB [TECH-1615] (#15642) --- .../org/hisp/dhis/analytics/TimeField.java | 2 +- .../dhis/program/AnalyticsPeriodBoundary.java | 2 +- .../data/DefaultEventDataQueryService.java | 2 +- .../data/JdbcEnrollmentAnalyticsManager.java | 2 +- .../event/data/JdbcEventAnalyticsManager.java | 2 +- .../table/JdbcEventAnalyticsTableManager.java | 4 +-- .../JdbcTeiEventsAnalyticsTableManager.java | 2 +- .../data/EnrollmentAnalyticsManagerTest.java | 2 +- .../event/data/EventAnalyticsManagerTest.java | 8 +++--- .../event/data/TimeFieldSqlRendererTest.java | 4 +-- .../JdbcEventAnalyticsTableManagerTest.java | 2 +- .../hisp/dhis/period/PeriodDataProvider.java | 2 +- .../hisp/dhis/program/variable/vDueDate.java | 4 +-- .../dhis/program/variable/vScheduledDate.java | 4 +-- .../HibernateTrackedEntityStore.java | 6 ++--- .../dhis/program/hibernate/Enrollment.hbm.xml | 2 +- .../hisp/dhis/program/hibernate/Event.hbm.xml | 2 +- .../ProgramSqlGeneratorVariablesTest.java | 2 +- .../tracker/event/JdbcEventStore.java | 20 +++++++-------- .../context/ProgramStageInstanceSupplier.java | 4 +-- .../trackedentity/store/query/EventQuery.java | 2 +- .../dhis/tracker/export/event/EventQuery.java | 2 +- .../tracker/export/event/JdbcEventStore.java | 25 ++++++++++--------- .../HibernateTrackedEntityStore.java | 12 ++++----- .../mapper/EventRowCallbackHandler.java | 2 +- .../aggregates/query/EventQuery.java | 2 +- ...nameDueDateToScheduledDateInEventTable.sql | 11 ++++++++ .../AbstractStatementBuilder.java | 7 +++--- .../ProgramIndicatorServiceVariableTest.java | 8 +++--- .../tracker/event_and_enrollment.json | 16 ++++++------ 30 files changed, 89 insertions(+), 76 deletions(-) create mode 100644 dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_35__RenameDueDateToScheduledDateInEventTable.sql diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/TimeField.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/TimeField.java index 17a5d0907602..03d3fe774034 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/TimeField.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/TimeField.java @@ -44,7 +44,7 @@ public enum TimeField { ENROLLMENT_DATE("enrollmentdate"), INCIDENT_DATE("incidentdate"), // Not a typo, different naming convention between FE and database - SCHEDULED_DATE("duedate"), + SCHEDULED_DATE("scheduleddate"), COMPLETED_DATE("completeddate"), CREATED("created"), LAST_UPDATED("lastupdated"); diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/AnalyticsPeriodBoundary.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/AnalyticsPeriodBoundary.java index 7b5a8cb94758..75dd0fff3c17 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/AnalyticsPeriodBoundary.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/AnalyticsPeriodBoundary.java @@ -98,7 +98,7 @@ public class AnalyticsPeriodBoundary extends BaseIdentifiableObject implements E public static final String DB_INCIDENT_DATE = "incidentdate"; - public static final String DB_SCHEDULED_DATE = "duedate"; + public static final String DB_SCHEDULED_DATE = "scheduleddate"; public static final String DB_QUOTE = "\""; diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java index 27fd03bcfe69..8fda325d19c3 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java @@ -124,7 +124,7 @@ public class DefaultEventDataQueryService implements EventDataQueryService { private static final String COL_NAME_INCIDENTDATE = "incidentdate"; - private static final String COL_NAME_DUEDATE = "duedate"; + private static final String COL_NAME_DUEDATE = "scheduleddate"; private final ProgramService programService; diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEnrollmentAnalyticsManager.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEnrollmentAnalyticsManager.java index 672bfdf83ce6..267f704f6e23 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEnrollmentAnalyticsManager.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEnrollmentAnalyticsManager.java @@ -553,7 +553,7 @@ protected String getColumn(QueryItem item, String suffix) { && !item.getRepeatableStageParams().simpleStageValueExpected()) { return "(select json_agg(t1) from (select " + colName - + ", incidentdate, duedate, executiondate " + + ", incidentdate, scheduleddate, executiondate " + " from " + eventTableName + " where " diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java index 710eab35adf6..de170a7b5a4b 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java @@ -324,7 +324,7 @@ protected String getSelectClause(EventQueryParams params) { "createdbydisplayname", "lastupdatedbydisplayname", "lastupdated", - "duedate"); + "scheduleddate"); if (params.getProgram().isRegistration()) { cols.add("enrollmentdate", "incidentdate", "tei", "pi"); diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java index 9afd7d577b8b..3c3b1e515992 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java @@ -142,7 +142,7 @@ public JdbcEventAnalyticsTableManager( new AnalyticsTableColumn(quote("enrollmentdate"), TIMESTAMP, "pi.enrollmentdate"), new AnalyticsTableColumn(quote("incidentdate"), TIMESTAMP, "pi.incidentdate"), new AnalyticsTableColumn(quote("executiondate"), TIMESTAMP, "psi.executiondate"), - new AnalyticsTableColumn(quote("duedate"), TIMESTAMP, "psi.duedate"), + new AnalyticsTableColumn(quote("scheduleddate"), TIMESTAMP, "psi.scheduleddate"), new AnalyticsTableColumn(quote("completeddate"), TIMESTAMP, "psi.completeddate"), /* @@ -262,7 +262,7 @@ public List getAnalyticsTables(AnalyticsTableUpdateParams params * status */ static String getDateLinkedToStatus() { - return "CASE WHEN 'SCHEDULE' = psi.status THEN psi.duedate ELSE psi.executiondate END"; + return "CASE WHEN 'SCHEDULE' = psi.status THEN psi.scheduleddate ELSE psi.executiondate END"; } /** diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcTeiEventsAnalyticsTableManager.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcTeiEventsAnalyticsTableManager.java index 58d36e1d063e..608cb0f1d7f5 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcTeiEventsAnalyticsTableManager.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcTeiEventsAnalyticsTableManager.java @@ -137,7 +137,7 @@ public JdbcTeiEventsAnalyticsTableManager( new AnalyticsTableColumn(quote("executiondate"), TIMESTAMP, "psi.executiondate"), new AnalyticsTableColumn(quote("lastupdated"), TIMESTAMP, "psi.lastupdated"), new AnalyticsTableColumn(quote("created"), TIMESTAMP, "psi.created"), - new AnalyticsTableColumn(quote("duedate"), TIMESTAMP, "psi.duedate"), + new AnalyticsTableColumn(quote("scheduleddate"), TIMESTAMP, "psi.scheduleddate"), new AnalyticsTableColumn(quote("status"), VARCHAR_50, "psi.status"), new AnalyticsTableColumn(quote("psigeometry"), GEOMETRY, "psi.geometry") .withIndexType(GIST), diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EnrollmentAnalyticsManagerTest.java b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EnrollmentAnalyticsManagerTest.java index 7104b15d3f62..c8a2d60e945f 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EnrollmentAnalyticsManagerTest.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EnrollmentAnalyticsManagerTest.java @@ -744,7 +744,7 @@ void verifyGetColumnOfTypeCoordinateAndWithProgramStagesAndParamsWithReferenceTy is( "(select json_agg(t1) from (select \"" + dataElementA.getUid() - + "\", incidentdate, duedate, executiondate from analytics_event_" + + "\", incidentdate, scheduleddate, executiondate from analytics_event_" + programB.getUid() + " where analytics_event_" + programB.getUid() diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsManagerTest.java b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsManagerTest.java index 0547659a422c..0e53b0b1d3c6 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsManagerTest.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsManagerTest.java @@ -119,7 +119,7 @@ class EventAnalyticsManagerTest extends EventAnalyticsTest { + "createdbydisplayname" + "," + "lastupdatedbydisplayname" - + ",lastupdated,duedate,enrollmentdate,incidentdate,tei,pi,ST_AsGeoJSON(coalesce(ax.\"psigeometry\",ax.\"pigeometry\",ax.\"teigeometry\",ax.\"ougeometry\"), 6) as geometry,longitude,latitude,ouname,ounamehierarchy," + + ",lastupdated,scheduleddate,enrollmentdate,incidentdate,tei,pi,ST_AsGeoJSON(coalesce(ax.\"psigeometry\",ax.\"pigeometry\",ax.\"teigeometry\",ax.\"ougeometry\"), 6) as geometry,longitude,latitude,ouname,ounamehierarchy," + "oucode,pistatus,psistatus"; @BeforeEach @@ -157,7 +157,7 @@ void verifyGetEventSqlWithProgramWithNoRegistration() { + "createdbydisplayname" + "," + "lastupdatedbydisplayname" - + ",lastupdated,duedate,ST_AsGeoJSON(coalesce(ax.\"psigeometry\",ax.\"pigeometry\",ax.\"teigeometry\",ax.\"ougeometry\"), 6) as geometry," + + ",lastupdated,scheduleddate,ST_AsGeoJSON(coalesce(ax.\"psigeometry\",ax.\"pigeometry\",ax.\"teigeometry\",ax.\"ougeometry\"), 6) as geometry," + "longitude,latitude,ouname,ounamehierarchy,oucode,pistatus,psistatus,ax.\"quarterly\",ax.\"ou\" from " + getTable(programA.getUid()) + " as ax where (ax.\"quarterly\" in ('2000Q1') ) and ax.\"uidlevel1\" in ('ouabcdefghA') limit 101"; @@ -218,7 +218,7 @@ void verifyGetEventSqlWithOrgUnitTypeDataElement() { + "createdbydisplayname" + "," + "lastupdatedbydisplayname" - + ",lastupdated,duedate,enrollmentdate," + + ",lastupdated,scheduleddate,enrollmentdate," + "incidentdate,tei,pi,ST_AsGeoJSON(coalesce(ax.\"psigeometry\",ax.\"pigeometry\",ax.\"teigeometry\",ax.\"ougeometry\"), 6) as geometry,longitude,latitude,ouname,ounamehierarchy,oucode,pistatus," + "psistatus,ax.\"quarterly\",ax.\"ou\",\"" + dataElement.getUid() @@ -334,7 +334,7 @@ void verifyGetEventsWithScheduledDateTimeFieldParam() { String expected = "ps.\"quarterly\",ax.\"ou\" from " + getTable(programA.getUid()) - + " as ax left join _dateperiodstructure as ps on cast(ax.\"duedate\" as date) = ps.\"dateperiod\" " + + " as ax left join _dateperiodstructure as ps on cast(ax.\"scheduleddate\" as date) = ps.\"dateperiod\" " + "where (ps.\"quarterly\" in ('2000Q1') ) and ax.\"uidlevel1\" " + "in ('ouabcdefghA') and pistatus in ('ACTIVE','COMPLETED') limit 101"; diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/TimeFieldSqlRendererTest.java b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/TimeFieldSqlRendererTest.java index 0ed496d0e458..359ba86e483a 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/TimeFieldSqlRendererTest.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/TimeFieldSqlRendererTest.java @@ -201,8 +201,8 @@ void testRenderEnrollmentTimeFieldSqlWhenNoContinuousMonthlyPeriodWithTimeFieldA params = new EventQueryParams.Builder(params).withStartEndDatesForPeriods().build(); assertEquals( - "((ax.\"duedate\" >= '2022-03-01' and ax.\"duedate\" < '2022-04-01') " - + "or (ax.\"duedate\" >= '2022-09-01' and ax.\"duedate\" < '2022-10-01')) ", + "((ax.\"scheduleddate\" >= '2022-03-01' and ax.\"scheduleddate\" < '2022-04-01') " + + "or (ax.\"scheduleddate\" >= '2022-09-01' and ax.\"scheduleddate\" < '2022-10-01')) ", timeFieldSqlRenderer.renderPeriodTimeFieldSql(params)); } diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManagerTest.java b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManagerTest.java index 078af8dd771e..aaa51c85c446 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManagerTest.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManagerTest.java @@ -976,6 +976,6 @@ private String getYearQueryForCurrentYear( } private String getDateLinkedToStatus() { - return "CASE WHEN 'SCHEDULE' = psi.status THEN psi.duedate ELSE psi.executiondate END"; + return "CASE WHEN 'SCHEDULE' = psi.status THEN psi.scheduleddate ELSE psi.executiondate END"; } } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/PeriodDataProvider.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/PeriodDataProvider.java index 9d87831c4a20..cfe7edd007af 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/PeriodDataProvider.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/PeriodDataProvider.java @@ -118,7 +118,7 @@ void addSafetyBuffer(List years, int buffer) { */ private List fetchAvailableYears() { String dueDateOrExecutionDate = - "(case when 'SCHEDULE' = ev.status then ev.duedate else ev.executiondate end)"; + "(case when 'SCHEDULE' = ev.status then ev.scheduleddate else ev.executiondate end)"; String sql = "( select distinct (extract(year from pe.startdate)) as datayear from period pe )" diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vDueDate.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vDueDate.java index e46a683455a9..e2cb1b986602 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vDueDate.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vDueDate.java @@ -42,14 +42,14 @@ public Object getSql(CommonExpressionVisitor visitor) { ProgramExpressionParams params = visitor.getProgParams(); if (AnalyticsType.EVENT == params.getProgramIndicator().getAnalyticsType()) { - return "duedate"; + return "scheduleddate"; } return visitor .getStatementBuilder() .getProgramIndicatorEventColumnSql( null, - "duedate", + "scheduleddate", params.getReportingStartDate(), params.getReportingEndDate(), params.getProgramIndicator()); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vScheduledDate.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vScheduledDate.java index 073a0e9969c8..ad32b9ddd6db 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vScheduledDate.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vScheduledDate.java @@ -47,7 +47,7 @@ public Object getSql(CommonExpressionVisitor visitor) { .getStatementBuilder() .getProgramIndicatorEventColumnSql( null, - "duedate", + "scheduleddate", params.getReportingStartDate(), params.getReportingEndDate(), params.getProgramIndicator()); @@ -55,7 +55,7 @@ public Object getSql(CommonExpressionVisitor visitor) { return maybeAppendEventStatusFilterIntoWhere(sqlStatement); } - return "duedate"; + return "scheduleddate"; } private String maybeAppendEventStatusFilterIntoWhere(String sqlStatement) { diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityStore.java index ed5f6f24f49e..25c2d934d30b 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityStore.java @@ -116,7 +116,7 @@ public class HibernateTrackedEntityStore extends SoftDeleteHibernateObjectStore< private static final String EV_EXECUTIONDATE = "EV.executiondate"; - private static final String EV_DUEDATE = "EV.duedate"; + private static final String EV_DUEDATE = "EV.scheduleddate"; private static final String IS_NULL = "IS NULL"; @@ -1035,7 +1035,7 @@ private String getFromSubQueryEvent(TrackedEntityQueryParams params) { .append(SPACE) .append(IS_NULL) .append(whereHlp.whereAnd()) - .append("date(now()) <= date(EV.duedate) "); + .append("date(now()) <= date(EV.scheduleddate) "); } else if (params.isEventStatus(EventStatus.OVERDUE)) { events .append(getQueryDateConditionBetween(whereHlp, EV_DUEDATE, start, end)) @@ -1048,7 +1048,7 @@ private String getFromSubQueryEvent(TrackedEntityQueryParams params) { .append(SPACE) .append(IS_NULL) .append(whereHlp.whereAnd()) - .append("date(now()) > date(EV.duedate) "); + .append("date(now()) > date(EV.scheduleddate) "); } else if (params.isEventStatus(EventStatus.SKIPPED)) { events .append(getQueryDateConditionBetween(whereHlp, EV_DUEDATE, start, end)) diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml index be60fd779475..010cb4d4bab6 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml +++ b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml @@ -59,7 +59,7 @@ - + diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml index 67e24a8085a4..41d76601455a 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml +++ b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml @@ -44,7 +44,7 @@ - + diff --git a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorVariablesTest.java b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorVariablesTest.java index ef3aa361fd7d..37fe6b97aab2 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorVariablesTest.java +++ b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorVariablesTest.java @@ -159,7 +159,7 @@ void testCurrentDateForEvent() { @Test void testDueDate() { String sql = castString(test("V{due_date}", new DefaultLiteral(), eventIndicator)); - assertThat(sql, is("duedate")); + assertThat(sql, is("scheduleddate")); } @Test diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java index ea762db34bf8..fe2d09c35b67 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java @@ -1029,7 +1029,7 @@ private String getEventSelectQuery( .append( "psi.eventid as psi_id, psi.status as psi_status, psi.executiondate as psi_executiondate, ") .append( - "psi.eventdatavalues as psi_eventdatavalues, psi.duedate as psi_duedate, psi.completedby as psi_completedby, psi.storedby as psi_storedby, ") + "psi.eventdatavalues as psi_eventdatavalues, psi.scheduleddate as psi_duedate, psi.completedby as psi_completedby, psi.storedby as psi_storedby, ") .append( "psi.created as psi_created, psi.createdbyuserinfo as psi_createdbyuserinfo, psi.lastupdated as psi_lastupdated, psi.lastupdatedbyuserinfo as psi_lastupdatedbyuserinfo, ") .append("psi.completeddate as psi_completeddate, psi.deleted as psi_deleted, ") @@ -1185,7 +1185,7 @@ private StringBuilder getFromWhereClause( fromBuilder .append(hlp.whereAnd()) - .append(" (psi.duedate is not null and psi.duedate >= :startDueDate ) "); + .append(" (psi.scheduleddate is not null and psi.scheduleddate >= :startDueDate ) "); } if (params.getDueDateEnd() != null) { @@ -1193,7 +1193,7 @@ private StringBuilder getFromWhereClause( fromBuilder .append(hlp.whereAnd()) - .append(" (psi.duedate is not null and psi.duedate <= :endDueDate ) "); + .append(" (psi.scheduleddate is not null and psi.scheduleddate <= :endDueDate ) "); } if (params.getFollowUp() != null) { @@ -1242,7 +1242,7 @@ private StringBuilder getFromWhereClause( .append(hlp.whereAnd()) .append(" (psi.executiondate >= ") .append(":startDate") - .append(" or (psi.executiondate is null and psi.duedate >= ") + .append(" or (psi.executiondate is null and psi.scheduleddate >= ") .append(":startDate") .append(" )) "); } @@ -1254,7 +1254,7 @@ private StringBuilder getFromWhereClause( .append(hlp.whereAnd()) .append(" (psi.executiondate < ") .append(":endDate") - .append(" or (psi.executiondate is null and psi.duedate < ") + .append(" or (psi.executiondate is null and psi.scheduleddate < ") .append(":endDate") .append(" )) "); } @@ -1531,7 +1531,7 @@ private String getFromWhereClause( .append(hlp.whereAnd()) .append(" (psi.executiondate >= ") .append(":startDate") - .append(" or (psi.executiondate is null and psi.duedate >= ") + .append(" or (psi.executiondate is null and psi.scheduleddate >= ") .append(":startDate") .append(" )) "); } @@ -1543,7 +1543,7 @@ private String getFromWhereClause( .append(hlp.whereAnd()) .append(" (psi.executiondate < ") .append(":endDate ") - .append(" or (psi.executiondate is null and psi.duedate < ") + .append(" or (psi.executiondate is null and psi.scheduleddate < ") .append(":endDate") .append(" )) "); } @@ -1568,7 +1568,7 @@ private String getFromWhereClause( sqlBuilder .append(hlp.whereAnd()) - .append(" psi.duedate is not null and psi.duedate >= ") + .append(" psi.scheduleddate is not null and psi.scheduleddate >= ") .append(":dueDate") .append(" "); } @@ -1578,7 +1578,7 @@ private String getFromWhereClause( sqlBuilder .append(hlp.whereAnd()) - .append(" psi.duedate is not null and psi.duedate <= ") + .append(" psi.scheduleddate is not null and psi.scheduleddate <= ") .append(":endDueDate") .append(" "); } @@ -1637,7 +1637,7 @@ private String eventStatusSql( stringBuilder .append(hlp.whereAnd()) - .append(" date(now()) > date(psi.duedate) and psi.status = ") + .append(" date(now()) > date(psi.scheduleddate) and psi.status = ") .append(":" + PSI_STATUS) .append(" "); } else { diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java index fc972b0bedca..0a3590ea4eeb 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java @@ -91,7 +91,7 @@ public Map get( final String sql = "select psi.enrollmentid, psi.programstageid, psi.eventid, " - + "psi.uid, psi.status, psi.deleted, psi.eventdatavalues, psi.duedate, psi.executiondate, " + + "psi.uid, psi.status, psi.deleted, psi.eventdatavalues, psi.scheduleddate, psi.executiondate, " + "psi.completeddate, psi.attributeoptioncomboid, psi.geometry, " + "ou.organisationunitid, ou.uid, ou.code, ou.name, psi.attributeoptioncomboid, c.uid as coc_uid " + "from event psi join organisationunit ou on psi.organisationunitid = ou.organisationunitid " @@ -116,7 +116,7 @@ public Map get( psi.setDeleted(rs.getBoolean("deleted")); psi.setProgramStage(getProgramStage(importOptions, rs.getLong("programstageid"))); psi.setOrganisationUnit(getOu(rs)); - psi.setScheduledDate(rs.getTimestamp("duedate")); + psi.setScheduledDate(rs.getTimestamp("scheduleddate")); psi.setOccurredDate(rs.getTimestamp("executiondate")); psi.setCompletedDate(rs.getTimestamp("completeddate")); psi.setAttributeOptionCombo(getCatOptionCombo(rs)); diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/trackedentity/store/query/EventQuery.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/trackedentity/store/query/EventQuery.java index e7d23c56931e..69050674cd78 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/trackedentity/store/query/EventQuery.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/trackedentity/store/query/EventQuery.java @@ -50,7 +50,7 @@ public enum COLUMNS { UID(new TableColumn("psi", "uid")), STATUS(new TableColumn("psi", "status")), EXECUTION_DATE(new TableColumn("psi", "executiondate")), - DUE_DATE(new TableColumn("psi", "duedate")), + DUE_DATE(new TableColumn("psi", "scheduleddate")), STOREDBY(new TableColumn("psi", "storedby")), COMPLETEDBY(new TableColumn("psi", "completedby")), COMPLETEDDATE(new TableColumn("psi", "completeddate")), diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQuery.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQuery.java index 3e8d6e5e7ddb..c5b14535eeda 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQuery.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQuery.java @@ -40,7 +40,7 @@ public enum COLUMNS { UID(new TableColumn("ev", "uid")), STATUS(new TableColumn("ev", "status")), EXECUTION_DATE(new TableColumn("ev", "executiondate")), - DUE_DATE(new TableColumn("ev", "duedate")), + SCHEDULED_DATE(new TableColumn("ev", "scheduleddate")), STOREDBY(new TableColumn("ev", "storedby")), COMPLETEDBY(new TableColumn("ev", "completedby")), COMPLETEDDATE(new TableColumn("ev", "completeddate")), diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java index 0650e9f9ba25..1a6c81fdc885 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java @@ -164,7 +164,7 @@ class JdbcEventStore implements EventStore { private static final String COLUMN_EVENT_EXECUTION_DATE = "ev_executiondate"; private static final String COLUMN_ENROLLMENT_FOLLOWUP = "en_followup"; private static final String COLUMN_EVENT_STATUS = "ev_status"; - private static final String COLUMN_EVENT_DUE_DATE = "ev_duedate"; + private static final String COLUMN_EVENT_SCHEDULED_DATE = "ev_scheduleddate"; private static final String COLUMN_EVENT_STORED_BY = "ev_storedby"; private static final String COLUMN_EVENT_LAST_UPDATED_BY = "ev_lastupdatedbyuserinfo"; private static final String COLUMN_EVENT_CREATED_BY = "ev_createdbyuserinfo"; @@ -201,7 +201,7 @@ class JdbcEventStore implements EventStore { entry("occurredDate", COLUMN_EVENT_EXECUTION_DATE), entry("enrollment.followUp", COLUMN_ENROLLMENT_FOLLOWUP), entry("status", COLUMN_EVENT_STATUS), - entry("scheduledDate", COLUMN_EVENT_DUE_DATE), + entry("scheduledDate", COLUMN_EVENT_SCHEDULED_DATE), entry("storedBy", COLUMN_EVENT_STORED_BY), entry("lastUpdatedBy", COLUMN_EVENT_LAST_UPDATED_BY), entry("createdBy", COLUMN_EVENT_CREATED_BY), @@ -326,7 +326,7 @@ private List fetchEvents(EventQueryParams queryParams, PageParams pagePar event.setAttributeOptionCombo(coc); event.setStoredBy(resultSet.getString(COLUMN_EVENT_STORED_BY)); - event.setScheduledDate(resultSet.getTimestamp(COLUMN_EVENT_DUE_DATE)); + event.setScheduledDate(resultSet.getTimestamp(COLUMN_EVENT_SCHEDULED_DATE)); event.setOccurredDate(resultSet.getTimestamp(COLUMN_EVENT_EXECUTION_DATE)); event.setCreated(resultSet.getTimestamp(COLUMN_EVENT_CREATED)); event.setCreatedByUserInfo( @@ -736,8 +736,8 @@ private String getEventSelectQuery( .append(", ev.executiondate as ") .append(COLUMN_EVENT_EXECUTION_DATE) .append(", ") - .append("ev.eventdatavalues as ev_eventdatavalues, ev.duedate as ") - .append(COLUMN_EVENT_DUE_DATE) + .append("ev.eventdatavalues as ev_eventdatavalues, ev.scheduleddate as ") + .append(COLUMN_EVENT_SCHEDULED_DATE) .append(", ev.completedby as ") .append(COLUMN_EVENT_COMPLETED_BY) .append(", ev.storedby as ") @@ -925,19 +925,20 @@ private StringBuilder getFromWhereClause( if (params.getScheduleAtStartDate() != null) { mapSqlParameterSource.addValue( - "startDueDate", params.getScheduleAtStartDate(), Types.TIMESTAMP); + "startScheduledDate", params.getScheduleAtStartDate(), Types.TIMESTAMP); fromBuilder .append(hlp.whereAnd()) - .append(" (ev.duedate is not null and ev.duedate >= :startDueDate ) "); + .append(" (ev.scheduleddate is not null and ev.scheduleddate >= :startScheduledDate ) "); } if (params.getScheduleAtEndDate() != null) { - mapSqlParameterSource.addValue("endDueDate", params.getScheduleAtEndDate(), Types.TIMESTAMP); + mapSqlParameterSource.addValue( + "endScheduledDate", params.getScheduleAtEndDate(), Types.TIMESTAMP); fromBuilder .append(hlp.whereAnd()) - .append(" (ev.duedate is not null and ev.duedate <= :endDueDate ) "); + .append(" (ev.scheduleddate is not null and ev.scheduleddate <= :endScheduledDate ) "); } if (params.getFollowUp() != null) { @@ -986,7 +987,7 @@ private StringBuilder getFromWhereClause( .append(hlp.whereAnd()) .append(" (ev.executiondate >= ") .append(":startDate") - .append(" or (ev.executiondate is null and ev.duedate >= ") + .append(" or (ev.executiondate is null and ev.scheduleddate >= ") .append(":startDate") .append(" )) "); } @@ -999,7 +1000,7 @@ private StringBuilder getFromWhereClause( .append(hlp.whereAnd()) .append(" (ev.executiondate < ") .append(":endDate") - .append(" or (ev.executiondate is null and ev.duedate < ") + .append(" or (ev.executiondate is null and ev.scheduleddate < ") .append(":endDate") .append(" )) "); } @@ -1377,7 +1378,7 @@ private String eventStatusSql( stringBuilder .append(hlp.whereAnd()) - .append(" date(now()) > date(ev.duedate) and ev.status = ") + .append(" date(now()) > date(ev.scheduleddate) and ev.status = ") .append(":" + COLUMN_EVENT_STATUS) .append(" "); } else { diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java index d35b691346d2..3674f00c448c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java @@ -98,7 +98,7 @@ class HibernateTrackedEntityStore extends SoftDeleteHibernateObjectStore date(EV.duedate) "); + .append("date(now()) > date(EV.scheduleddate) "); } else if (params.isEventStatus(EventStatus.SKIPPED)) { events - .append(getQueryDateConditionBetween(whereHlp, EV_DUEDATE, start, end)) + .append(getQueryDateConditionBetween(whereHlp, EV_SCHEDULEDDATE, start, end)) .append(whereHlp.whereAnd()) .append(EV_STATUS) .append(EQUALS) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java index 53d4e128a652..2e1c96decbd2 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EventRowCallbackHandler.java @@ -69,7 +69,7 @@ private Event getEvent(ResultSet rs) throws SQLException { event.setStatus(EventStatus.valueOf(rs.getString(EventQuery.getColumnName(COLUMNS.STATUS)))); event.setOccurredDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.EXECUTION_DATE))); - event.setScheduledDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.DUE_DATE))); + event.setScheduledDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.SCHEDULED_DATE))); event.setStoredBy(rs.getString(EventQuery.getColumnName(COLUMNS.STOREDBY))); event.setCompletedBy(rs.getString(EventQuery.getColumnName(COLUMNS.COMPLETEDBY))); event.setCompletedDate(rs.getTimestamp(EventQuery.getColumnName(COLUMNS.COMPLETEDDATE))); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/query/EventQuery.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/query/EventQuery.java index d1b2daf90705..0ee147c615de 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/query/EventQuery.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/query/EventQuery.java @@ -46,7 +46,7 @@ public enum COLUMNS { UID(new TableColumn("ev", "uid")), STATUS(new TableColumn("ev", "status")), EXECUTION_DATE(new TableColumn("ev", "executiondate")), - DUE_DATE(new TableColumn("ev", "duedate")), + SCHEDULED_DATE(new TableColumn("ev", "scheduleddate")), STOREDBY(new TableColumn("ev", "storedby")), COMPLETEDBY(new TableColumn("ev", "completedby")), COMPLETEDDATE(new TableColumn("ev", "completeddate")), diff --git a/dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_35__RenameDueDateToScheduledDateInEventTable.sql b/dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_35__RenameDueDateToScheduledDateInEventTable.sql new file mode 100644 index 000000000000..14af6e85b71b --- /dev/null +++ b/dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_35__RenameDueDateToScheduledDateInEventTable.sql @@ -0,0 +1,11 @@ +-- rename duedate in event + +do $$ +begin + if exists(select 1 + from information_schema.columns + where table_schema != 'information_schema' and table_name='event' and column_name='duedate') + then +alter table event rename column duedate to scheduleddate; +end if; +end $$; \ No newline at end of file diff --git a/dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/AbstractStatementBuilder.java b/dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/AbstractStatementBuilder.java index 0542f74bc987..6b201cacbc3e 100644 --- a/dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/AbstractStatementBuilder.java +++ b/dhis-2/dhis-support/dhis-support-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/AbstractStatementBuilder.java @@ -557,9 +557,10 @@ private String getBoundaryColumn( * COMPLETED status). * *

Now, we also need to support SCHEDULE status for events. For this reason this method - * compares the status. If the column is "duedate", it means we only want SCHEDULE status, so we - * return "duedate". In all other cases we assume any other status different from SCHEDULE (which - * makes it backward compatible). In this case the logic will remain based on "executiondate". + * compares the status. If the column is "scheduleddate", it means we only want SCHEDULE status, + * so we return "scheduleddate". In all other cases we assume any other status different from + * SCHEDULE (which makes it backward compatible). In this case the logic will remain based on + * "executiondate". * * @param column * @return the backwards compatible column diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceVariableTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceVariableTest.java index 8efc0da25ada..e1b4d54040bf 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceVariableTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceVariableTest.java @@ -138,9 +138,9 @@ void testCurrentDate() { @Test void testDueDate() { - assertEquals("duedate", getSql("V{due_date}")); + assertEquals("scheduleddate", getSql("V{due_date}")); assertEquals( - "(select duedate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and duedate is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) order by executiondate desc limit 1 )", + "(select scheduleddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and scheduleddate is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) order by executiondate desc limit 1 )", getSqlEnrollment("V{due_date}")); } @@ -211,9 +211,9 @@ void testEventDate() { @Test void testScheduledDate() { - assertEquals("duedate", getSql("V{scheduled_date}")); + assertEquals("scheduleddate", getSql("V{scheduled_date}")); assertEquals( - "(select duedate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and duedate is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) and psistatus = 'SCHEDULE' order by executiondate desc limit 1 )", + "(select scheduleddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and scheduleddate is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) and psistatus = 'SCHEDULE' order by executiondate desc limit 1 )", getSqlEnrollment("V{scheduled_date}")); } diff --git a/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json b/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json index 4c8d09ca4b2a..4aebaaca982d 100644 --- a/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json +++ b/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json @@ -311,7 +311,7 @@ "orgUnitName": "Mbokie CHP", "enrolledAt": "2021-02-28T12:05:00.000", "occurredAt": "2021-02-28T12:05:00.000", - "dueDate": "2021-02-28T12:05:00.000", + "scheduledAt": "2021-02-28T12:05:00.000", "followUp": false, "deleted": false, "events": [], @@ -335,7 +335,7 @@ "orgUnitName": "Mbokie CHP", "enrolledAt": "2021-03-28T12:05:00.000", "occurredAt": "2021-03-28T12:05:00.000", - "dueDate": "2021-02-28T12:05:00.000", + "scheduledAt": "2021-02-28T12:05:00.000", "followUp": false, "deleted": false, "events": [], @@ -359,7 +359,7 @@ "orgUnitName": "test-orgunit-2", "enrolledAt": "2021-02-28T12:05:00.000", "occurredAt": "2021-02-28T12:05:00.000", - "dueDate": "2021-02-28T12:05:00.000", + "scheduledAt": "2021-02-28T12:05:00.000", "followUp": false, "deleted": false, "events": [], @@ -383,7 +383,7 @@ "orgUnitName": "test-orgunit-2", "enrolledAt": "2021-02-28T12:05:00.000", "occurredAt": "2021-02-28T12:05:00.000", - "dueDate": "2021-02-28T12:05:00.000", + "scheduledAt": "2021-02-28T12:05:00.000", "followUp": false, "deleted": false, "events": [], @@ -407,7 +407,7 @@ "orgUnitName": "test-orgunit-3", "enrolledAt": "2021-02-28T12:05:00.000", "occurredAt": "2021-02-28T12:05:00.000", - "dueDate": "2021-02-28T12:05:00.000", + "scheduledAt": "2021-02-28T12:05:00.000", "followUp": false, "deleted": false, "events": [], @@ -431,7 +431,7 @@ "orgUnitName": "test-orgunit-3", "enrolledAt": "2021-02-28T12:05:00.000", "occurredAt": "2021-02-28T12:05:00.000", - "dueDate": "2021-02-28T12:05:00.000", + "scheduledAt": "2021-02-28T12:05:00.000", "followUp": false, "deleted": false, "events": [], @@ -455,7 +455,7 @@ "orgUnitName": "test-orgunit-3", "enrolledAt": "2021-02-28T12:05:00.000", "occurredAt": "2021-02-28T12:05:00.000", - "dueDate": "2021-02-28T12:05:00.000", + "scheduledAt": "2021-02-28T12:05:00.000", "followUp": false, "deleted": false, "events": [], @@ -479,7 +479,7 @@ "orgUnitName": "test-orgunit-3", "enrolledAt": "2021-02-28T12:05:00.000", "occurredAt": "2021-02-28T12:05:00.000", - "dueDate": "2021-02-28T12:05:00.000", + "scheduledAt": "2021-02-28T12:05:00.000", "followUp": false, "deleted": false, "events": [], From 21d1572ee77a7664cafe60396dcd75881f0ecf5c Mon Sep 17 00:00:00 2001 From: Giuseppe Nespolino Date: Fri, 10 Nov 2023 16:26:12 +0100 Subject: [PATCH 50/63] refactor: changed analytics export controller flag names [DHIS2-13779] (#15643) --- .../extensions/AnalyticsSetupExtension.java | 5 +++- .../controller/ResourceTableController.java | 26 ++++++++++--------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/helpers/extensions/AnalyticsSetupExtension.java b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/helpers/extensions/AnalyticsSetupExtension.java index 51c178575835..eed27ec7ce50 100644 --- a/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/helpers/extensions/AnalyticsSetupExtension.java +++ b/dhis-2/dhis-test-e2e/src/test/java/org/hisp/dhis/helpers/extensions/AnalyticsSetupExtension.java @@ -73,7 +73,10 @@ public void beforeAll(ExtensionContext context) { // Invoke the analytics table generation process. ApiResponse response = new ResourceTableActions() - .post("/analytics", new JsonObject(), new QueryParamsBuilder().add("executeTei=true")) + .post( + "/analytics", + new JsonObject(), + new QueryParamsBuilder().add("skipTrackedEntities=false")) .validateStatus(200); String analyticsTaskId = response.extractString("response.id"); diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/ResourceTableController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/ResourceTableController.java index e1f48dbdc291..4a5046960285 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/ResourceTableController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/ResourceTableController.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.webapi.controller; +import static org.apache.commons.lang3.BooleanUtils.isTrue; import static org.hisp.dhis.analytics.AnalyticsTableType.COMPLETENESS; import static org.hisp.dhis.analytics.AnalyticsTableType.COMPLETENESS_TARGET; import static org.hisp.dhis.analytics.AnalyticsTableType.DATA_VALUE; @@ -69,7 +70,7 @@ import org.springframework.web.bind.annotation.ResponseBody; /** - * @author Lars Helge Overland + * @author Lars Helge Overland. This is the AnalyticsExportController */ @OpenApi.Tags("analytics") @Controller @@ -88,36 +89,37 @@ public class ResourceTableController { @PreAuthorize("hasRole('ALL') or hasRole('F_PERFORM_MAINTENANCE')") @ResponseBody public WebMessage analytics( - @RequestParam(required = false) boolean skipResourceTables, - @RequestParam(required = false) boolean skipAggregate, - @RequestParam(required = false) boolean skipEvents, - @RequestParam(required = false) boolean skipEnrollment, - @RequestParam(required = false) boolean executeTei, - @RequestParam(required = false) boolean skipOrgUnitOwnership, + @RequestParam(defaultValue = "false") Boolean skipResourceTables, + @RequestParam(defaultValue = "false") Boolean skipAggregate, + @RequestParam(defaultValue = "false") Boolean skipEvents, + @RequestParam(defaultValue = "false") Boolean skipEnrollment, + // STILL EXPERIMENTAL: to export TEIs, FE needs to set this to "false" explicitly + @RequestParam(defaultValue = "true") Boolean skipTrackedEntities, + @RequestParam(defaultValue = "false") Boolean skipOrgUnitOwnership, @RequestParam(required = false) Integer lastYears) throws ConflictException, @OpenApi.Ignore NotFoundException { Set skipTableTypes = new HashSet<>(); Set skipPrograms = new HashSet<>(); - if (skipAggregate) { + if (isTrue(skipAggregate)) { skipTableTypes.add(DATA_VALUE); skipTableTypes.add(COMPLETENESS); skipTableTypes.add(COMPLETENESS_TARGET); } - if (skipEvents) { + if (isTrue(skipEvents)) { skipTableTypes.add(EVENT); } - if (skipEnrollment) { + if (isTrue(skipEnrollment)) { skipTableTypes.add(ENROLLMENT); } - if (skipOrgUnitOwnership) { + if (isTrue(skipOrgUnitOwnership)) { skipTableTypes.add(OWNERSHIP); } - if (!executeTei) { + if (isTrue(skipTrackedEntities)) { skipTableTypes.add(TRACKED_ENTITY_INSTANCE); skipTableTypes.add(TRACKED_ENTITY_INSTANCE_EVENTS); skipTableTypes.add(TRACKED_ENTITY_INSTANCE_ENROLLMENTS); From 270ca56ff741e9c187d6cde00bea9814894a9906 Mon Sep 17 00:00:00 2001 From: Enrico Colasante Date: Mon, 13 Nov 2023 08:08:52 +0100 Subject: [PATCH 51/63] chore: Rename endDate to completedDate in service layer [TECH-1665] (#15652) * chore: Rename endDate to completedDate in service layer [TECH-1665] * Fix tests --- .../main/java/org/hisp/dhis/program/Enrollment.java | 12 ++++++------ .../java/org/hisp/dhis/program/EnrollmentTest.java | 8 ++++---- .../hisp/dhis/program/DefaultEnrollmentService.java | 4 ++-- .../hisp/dhis/program/hibernate/Enrollment.hbm.xml | 2 +- .../enrollment/AbstractEnrollmentService.java | 8 ++++---- .../importer/shared/validation/EventBaseCheck.java | 4 ++-- .../shared/validation/EventBaseCheckTest.java | 2 +- .../export/enrollment/DefaultEnrollmentService.java | 2 +- .../export/enrollment/HibernateEnrollmentStore.java | 2 +- .../mapper/EnrollmentRowCallbackHandler.java | 2 +- .../converter/EnrollmentTrackerConverterService.java | 4 ++-- .../dhis/tracker/imports/bundle/OwnershipTest.java | 4 ++-- .../tracker/export/enrollment/EnrollmentMapper.java | 4 ++-- .../export/relationship/RelationshipItemMapper.java | 2 +- 14 files changed, 30 insertions(+), 30 deletions(-) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Enrollment.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Enrollment.java index 6176a373c0a3..af2e119d9631 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Enrollment.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Enrollment.java @@ -71,7 +71,7 @@ public class Enrollment extends SoftDeletableObject { private Date enrollmentDate; - private Date endDate; + private Date completedDate; private UserInfoSnapshot createdByUserInfo; @@ -238,12 +238,12 @@ public void setEnrollmentDate(Date enrollmentDate) { @JsonProperty @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0) - public Date getEndDate() { - return endDate; + public Date getCompletedDate() { + return completedDate; } - public void setEndDate(Date endDate) { - this.endDate = endDate; + public void setCompletedDate(Date completedDate) { + this.completedDate = completedDate; } @JsonProperty @@ -434,7 +434,7 @@ private static void setShallowCopyValues( copy.setCompletedBy(original.getCompletedBy()); copy.setCreatedAtClient(original.getCreatedAtClient()); copy.setCreatedByUserInfo(original.getCreatedByUserInfo()); - copy.setEndDate(original.getEndDate()); + copy.setCompletedDate(original.getCompletedDate()); copy.setEnrollmentDate(original.getEnrollmentDate()); copy.setEvents(new HashSet<>()); copy.setFollowup(original.getFollowup()); diff --git a/dhis-2/dhis-api/src/test/java/org/hisp/dhis/program/EnrollmentTest.java b/dhis-2/dhis-api/src/test/java/org/hisp/dhis/program/EnrollmentTest.java index 5e127fd2abd1..4f34112e5c6f 100644 --- a/dhis-2/dhis-api/src/test/java/org/hisp/dhis/program/EnrollmentTest.java +++ b/dhis-2/dhis-api/src/test/java/org/hisp/dhis/program/EnrollmentTest.java @@ -68,7 +68,7 @@ void testCopyOfWithPropertyValuesSet() { assertEquals(original.getFollowup(), copy.getFollowup()); assertEquals(original.getGeometry(), copy.getGeometry()); assertEquals(original.getOrganisationUnit(), copy.getOrganisationUnit()); - assertEquals(original.getEndDate(), copy.getEndDate()); + assertEquals(original.getCompletedDate(), copy.getCompletedDate()); assertEquals(original.getRelationshipItems(), copy.getRelationshipItems()); assertEquals(original.getCreatedByUserInfo(), copy.getCreatedByUserInfo()); assertEquals(original.getMessageConversations(), copy.getMessageConversations()); @@ -86,7 +86,7 @@ void testCopyOfWithNullPropertyValues() { assertNotEquals(original.getProgram(), copy.getProgram()); assertEquals(original.getCreatedByUserInfo(), copy.getCreatedByUserInfo()); - assertEquals(original.getEndDate(), copy.getEndDate()); + assertEquals(original.getCompletedDate(), copy.getCompletedDate()); assertEquals(original.getEnrollmentDate(), copy.getEnrollmentDate()); assertEquals(original.getFollowup(), copy.getFollowup()); assertEquals(original.getGeometry(), copy.getGeometry()); @@ -117,7 +117,7 @@ private Enrollment getNewEnrollmentWithNoNulls() { e.setAutoFields(); e.setNotes(List.of(new Note("note", "amin"))); e.setCompletedBy("admin"); - e.setEndDate(new Date()); + e.setCompletedDate(new Date()); e.setEnrollmentDate(new Date()); e.setEvents(Set.of()); e.setFollowup(true); @@ -138,7 +138,7 @@ private Enrollment getNewEnrollmentWithNulls() { e.setName(null); e.setNotes(null); e.setCompletedBy(null); - e.setEndDate(null); + e.setCompletedDate(null); e.setEnrollmentDate(null); e.setEvents(null); e.setIncidentDate(null); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java index 672459e49f49..f4e8752ba6da 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultEnrollmentService.java @@ -472,7 +472,7 @@ public void cancelEnrollmentStatus(Enrollment enrollment) { // Set status as skipped for overdue events, or delete // ------------------------------------------------------------- - if (event.getScheduledDate().before(enrollment.getEndDate())) { + if (event.getScheduledDate().before(enrollment.getCompletedDate())) { event.setStatus(EventStatus.SKIPPED); eventStore.update(event); } else { @@ -501,7 +501,7 @@ public void incompleteEnrollmentStatus(Enrollment enrollment) { // ----------------------------------------------------------------- enrollment.setStatus(ProgramStatus.ACTIVE); - enrollment.setEndDate(null); + enrollment.setCompletedDate(null); updateEnrollment(enrollment); } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml index 010cb4d4bab6..d51291283fb5 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml +++ b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml @@ -32,7 +32,7 @@ - + diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/enrollment/AbstractEnrollmentService.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/enrollment/AbstractEnrollmentService.java index acf92bb1d53f..11ab9b31dfb3 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/enrollment/AbstractEnrollmentService.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/enrollment/AbstractEnrollmentService.java @@ -320,7 +320,7 @@ public org.hisp.dhis.dxf2.deprecated.tracker.enrollment.Enrollment getEnrollment enrollment.setEnrollmentDate(programInstance.getEnrollmentDate()); enrollment.setIncidentDate(programInstance.getIncidentDate()); enrollment.setFollowup(programInstance.getFollowup()); - enrollment.setCompletedDate(programInstance.getEndDate()); + enrollment.setCompletedDate(programInstance.getCompletedDate()); enrollment.setCompletedBy(programInstance.getCompletedBy()); enrollment.setStoredBy(programInstance.getStoredBy()); enrollment.setCreatedByUserInfo(programInstance.getCreatedByUserInfo()); @@ -598,7 +598,7 @@ private ImportSummary addEnrollment( } programInstance.setCompletedBy(user); - programInstance.setEndDate(date); + programInstance.setCompletedDate(date); } programInstance.setCreatedByUserInfo(UserInfoSnapshot.from(importOptions.getUser())); @@ -973,11 +973,11 @@ private ImportSummary updateEnrollment( } if (EnrollmentStatus.CANCELLED == enrollment.getStatus()) { - programInstance.setEndDate(endDate); + programInstance.setCompletedDate(endDate); enrollmentService.cancelEnrollmentStatus(programInstance); } else if (EnrollmentStatus.COMPLETED == enrollment.getStatus()) { - programInstance.setEndDate(endDate); + programInstance.setCompletedDate(endDate); programInstance.setCompletedBy(user); enrollmentService.completeEnrollmentStatus(programInstance); diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/EventBaseCheck.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/EventBaseCheck.java index f7ce521224bf..fe59df475dd1 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/EventBaseCheck.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/EventBaseCheck.java @@ -115,12 +115,12 @@ private void validateProgramInstance(ImmutableEvent event, WorkContext ctx, List referenceDate = removeTimeStamp(referenceDate); - if (referenceDate.after(removeTimeStamp(enrollment.getEndDate()))) { + if (referenceDate.after(removeTimeStamp(enrollment.getCompletedDate()))) { errors.add( "Not possible to add event to a completed enrollment. Event created date ( " + referenceDate + " ) is after enrollment completed date ( " - + removeTimeStamp(enrollment.getEndDate()) + + removeTimeStamp(enrollment.getCompletedDate()) + " )."); } } diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/EventBaseCheckTest.java b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/EventBaseCheckTest.java index 8f7b2bca3259..56c453a6a44d 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/EventBaseCheckTest.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/EventBaseCheckTest.java @@ -129,7 +129,7 @@ void verifyErrorOnEventWithDateNewerThanCompletedProgramInstance() { Enrollment enrollment = new Enrollment(); enrollment.setStatus(ProgramStatus.COMPLETED); // Set enrollment end date to NOW - one month - enrollment.setEndDate(Date.from(ZonedDateTime.now().minusMonths(1).toInstant())); + enrollment.setCompletedDate(Date.from(ZonedDateTime.now().minusMonths(1).toInstant())); programInstanceMap.put(event.getUid(), enrollment); when(workContext.getProgramInstanceMap()).thenReturn(programInstanceMap); when(workContext.getImportOptions()).thenReturn(importOptions); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java index cc21908c3b6d..3992d9c27579 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java @@ -125,7 +125,7 @@ public Enrollment getEnrollment( result.setEnrollmentDate(enrollment.getEnrollmentDate()); result.setIncidentDate(enrollment.getIncidentDate()); result.setFollowup(enrollment.getFollowup()); - result.setEndDate(enrollment.getEndDate()); + result.setCompletedDate(enrollment.getCompletedDate()); result.setCompletedBy(enrollment.getCompletedBy()); result.setStoredBy(enrollment.getStoredBy()); result.setCreatedByUserInfo(enrollment.getCreatedByUserInfo()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/HibernateEnrollmentStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/HibernateEnrollmentStore.java index 156170e36521..660d10da4951 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/HibernateEnrollmentStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/HibernateEnrollmentStore.java @@ -78,7 +78,7 @@ class HibernateEnrollmentStore extends SoftDeleteHibernateObjectStore ORDERABLE_FIELDS = Set.of( - "endDate", + "completedDate", "created", "createdAtClient", "enrollmentDate", diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EnrollmentRowCallbackHandler.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EnrollmentRowCallbackHandler.java index 568b8c57e093..79afa20af9f2 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EnrollmentRowCallbackHandler.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/mapper/EnrollmentRowCallbackHandler.java @@ -99,7 +99,7 @@ private Enrollment getEnrollment(ResultSet rs) throws SQLException { rs.getTimestamp(EnrollmentQuery.getColumnName(COLUMNS.ENROLLMENTDATE))); enrollment.setIncidentDate( rs.getTimestamp(EnrollmentQuery.getColumnName(COLUMNS.INCIDENTDATE))); - enrollment.setEndDate(rs.getTimestamp(EnrollmentQuery.getColumnName(COLUMNS.COMPLETED))); + enrollment.setCompletedDate(rs.getTimestamp(EnrollmentQuery.getColumnName(COLUMNS.COMPLETED))); enrollment.setCompletedBy(rs.getString(EnrollmentQuery.getColumnName(COLUMNS.COMPLETEDBY))); enrollment.setStoredBy(rs.getString(EnrollmentQuery.getColumnName(COLUMNS.STOREDBY))); enrollment.setDeleted(rs.getBoolean(EnrollmentQuery.getColumnName(COLUMNS.DELETED))); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EnrollmentTrackerConverterService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EnrollmentTrackerConverterService.java index 1344f829efc0..ef7a396bde6b 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EnrollmentTrackerConverterService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/converter/EnrollmentTrackerConverterService.java @@ -158,10 +158,10 @@ private Enrollment from( if (previousStatus != dbEnrollment.getStatus()) { if (dbEnrollment.isCompleted()) { - dbEnrollment.setEndDate(now); + dbEnrollment.setCompletedDate(now); dbEnrollment.setCompletedBy(preheat.getUsername()); } else if (dbEnrollment.getStatus().equals(ProgramStatus.CANCELLED)) { - dbEnrollment.setEndDate(now); + dbEnrollment.setCompletedDate(now); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java index d77d75a77b92..9c2517c0ad18 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java @@ -175,7 +175,7 @@ void testUpdateEnrollment() throws IOException { enrollments.stream().filter(e -> e.getUid().equals("TvctPPhpD8u")).findAny().get(); compareEnrollmentBasicProperties(enrollment, enrollmentParams.getEnrollments().get(0)); assertNull(enrollment.getCompletedBy()); - assertNull(enrollment.getEndDate()); + assertNull(enrollment.getCompletedDate()); org.hisp.dhis.tracker.imports.domain.Enrollment updatedEnrollment = enrollmentParams.getEnrollments().get(0); @@ -194,7 +194,7 @@ void testUpdateEnrollment() throws IOException { enrollment = enrollments.stream().filter(e -> e.getUid().equals("TvctPPhpD8u")).findAny().get(); compareEnrollmentBasicProperties(enrollment, updatedEnrollment); assertNotNull(enrollment.getCompletedBy()); - assertNotNull(enrollment.getEndDate()); + assertNotNull(enrollment.getCompletedDate()); } @Test diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/enrollment/EnrollmentMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/enrollment/EnrollmentMapper.java index 9521190a9b6e..3a58126c3798 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/enrollment/EnrollmentMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/enrollment/EnrollmentMapper.java @@ -59,7 +59,7 @@ public interface EnrollmentMapper */ Map ORDERABLE_FIELDS = Map.ofEntries( - entry("completedAt", "endDate"), + entry("completedAt", "completedDate"), entry("createdAt", "created"), entry("createdAtClient", "createdAtClient"), entry("enrolledAt", "enrollmentDate"), @@ -77,7 +77,7 @@ public interface EnrollmentMapper @Mapping(target = "enrolledAt", source = "enrollmentDate") @Mapping(target = "occurredAt", source = "incidentDate") @Mapping(target = "followUp", source = "followup") - @Mapping(target = "completedAt", source = "endDate") + @Mapping(target = "completedAt", source = "completedDate") @Mapping(target = "createdBy", source = "createdByUserInfo") @Mapping(target = "updatedBy", source = "lastUpdatedByUserInfo") @Mapping(target = "relationships", source = "relationshipItems") diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java index 021ec0c6565f..204f856aa4ac 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/export/relationship/RelationshipItemMapper.java @@ -83,7 +83,7 @@ interface RelationshipItemMapper @Mapping(target = "enrolledAt", source = "enrollmentDate") @Mapping(target = "occurredAt", source = "incidentDate") @Mapping(target = "followUp", source = "followup") - @Mapping(target = "completedAt", source = "endDate") + @Mapping(target = "completedAt", source = "completedDate") @Mapping(target = "createdBy", source = "createdByUserInfo") @Mapping(target = "updatedBy", source = "lastUpdatedByUserInfo") @Mapping(target = "attributes", source = "trackedEntity.trackedEntityAttributeValues") From baddaf80f0994d56cd8f5967b16310bf1f3dc61c Mon Sep 17 00:00:00 2001 From: Jason Pickering Date: Mon, 13 Nov 2023 12:36:19 +0300 Subject: [PATCH 52/63] fix: Close database connection after test statement. (#15640) * fix: Close database connection after test statement. --- .../java/org/hisp/dhis/datasource/DatabasePoolUtils.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/datasource/DatabasePoolUtils.java b/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/datasource/DatabasePoolUtils.java index 9d7d9ada1a9a..417b3bafac9b 100644 --- a/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/datasource/DatabasePoolUtils.java +++ b/dhis-2/dhis-support/dhis-support-hibernate/src/main/java/org/hisp/dhis/datasource/DatabasePoolUtils.java @@ -342,10 +342,12 @@ private static DataSource createC3p0DbPool(PoolConfig config) } public static void testConnection(DataSource dataSource) throws SQLException { - Connection conn = dataSource.getConnection(); - try (Statement stmt = conn.createStatement()) { + try (Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement()) { stmt.executeQuery("select 'connection_test' as connection_test;"); + } catch (SQLException e) { + log.error(e.getMessage()); } } } From d8e14c574560b87d3d8069df2b3ac9351faccda7 Mon Sep 17 00:00:00 2001 From: tonsV2 Date: Mon, 13 Nov 2023 18:38:37 +0700 Subject: [PATCH 53/63] ci:remove javadoc and move IM stage to the end (#15624) * ci: remove Javadoc * ci: move IM stage to the end of the pipeline * ci: increase overall timeout to 45 and instance timeout to 10 minutes --- jenkinsfiles/canary | 90 ++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 58 deletions(-) diff --git a/jenkinsfiles/canary b/jenkinsfiles/canary index 1d3a0ac16c0a..666f08e79b71 100644 --- a/jenkinsfiles/canary +++ b/jenkinsfiles/canary @@ -13,7 +13,7 @@ pipeline { options { buildDiscarder(logRotator(numToKeepStr: '5')) - timeout(time: 30) + timeout(time: 45) } environment { @@ -42,6 +42,36 @@ pipeline { } } + stage ('Build') { + steps { + echo 'Building DHIS2 ...' + script { + withMaven(options: [artifactsPublisher(disabled: true)]) { + sh 'mvn -X -T 4 --batch-mode --no-transfer-progress clean install -f dhis-2/pom.xml -P -default --update-snapshots -pl -dhis-web-embedded-jetty,-dhis-test-coverage' + sh 'mvn -X -T 4 --batch-mode --no-transfer-progress package -f dhis-2/dhis-web/pom.xml -P -default --update-snapshots' + } + } + } + } + + stage ('Sync WAR') { + steps { + echo 'Syncing WAR ...' + sh 'curl "https://raw.githubusercontent.com/dhis2/dhis2-server-setup/master/ci/scripts/copy-war-s3.sh" -O' + sh 'chmod +x copy-war-s3.sh' + sh './copy-war-s3.sh canary ${GIT_BRANCH}' + } + } + + stage ('Delete old WARs') { + steps { + echo 'Deleting old WARs ...' + sh 'curl "https://raw.githubusercontent.com/dhis2/dhis2-server-setup/master/ci/scripts/delete-old-wars.sh" -O' + sh 'chmod +x delete-old-wars.sh' + sh './delete-old-wars.sh ${GIT_BRANCH}' + } + } + stage('Update IM Play instance') { environment { HTTP = "http --check-status" @@ -86,7 +116,7 @@ pipeline { dir('scripts/instances') { sh "(./findByName.sh play nightly${branch} && ./restart.sh play nightly${branch}) || ./deploy-dhis2.sh play nightly${branch}" - timeout(5) { + timeout(10) { waitFor.statusOk("${env.INSTANCE_URL}${branch}") } } @@ -95,62 +125,6 @@ pipeline { } } } - - stage ('Build') { - steps { - echo 'Building DHIS2 ...' - script { - withMaven(options: [artifactsPublisher(disabled: true)]) { - sh 'mvn -X -T 4 --batch-mode --no-transfer-progress clean install -f dhis-2/pom.xml -P -default --update-snapshots -pl -dhis-web-embedded-jetty,-dhis-test-coverage' - sh 'mvn -X -T 4 --batch-mode --no-transfer-progress package -f dhis-2/dhis-web/pom.xml -P -default --update-snapshots' - } - } - } - } - - stage ('Sync WAR') { - steps { - echo 'Syncing WAR ...' - sh 'curl "https://raw.githubusercontent.com/dhis2/dhis2-server-setup/master/ci/scripts/copy-war-s3.sh" -O' - sh 'chmod +x copy-war-s3.sh' - sh './copy-war-s3.sh canary ${GIT_BRANCH}' - } - } - - stage ('Delete old WARs') { - steps { - echo 'Deleting old WARs ...' - sh 'curl "https://raw.githubusercontent.com/dhis2/dhis2-server-setup/master/ci/scripts/delete-old-wars.sh" -O' - sh 'chmod +x delete-old-wars.sh' - sh './delete-old-wars.sh ${GIT_BRANCH}' - } - } - - stage ('Generate Javadocs') { - steps { - echo 'Generating Javadocs ...' - script { - withMaven(options: [artifactsPublisher(disabled: true)]) { - sh 'mvn --batch-mode --no-transfer-progress clean install javadoc:aggregate -Pjavadoc -DskipTests=true -Dmaven.test.skip=true -f dhis-2/pom.xml' - } - } - } - - post { - success { - javadoc javadocDir: 'dhis-2/target/site/apidocs', keepAll: false - } - } - } - - stage ('Sync Javadocs') { - steps { - echo 'Syncing Javadocs ...' - sh 'curl "https://raw.githubusercontent.com/dhis2/dhis2-server-setup/master/ci/scripts/sync-javadocs-s3.sh" -O' - sh 'chmod +x sync-javadocs-s3.sh' - sh './sync-javadocs-s3.sh ${GIT_BRANCH}' - } - } } post { From 4baf61cd0e8f6cae6978261a0ce48afb00b1d2e4 Mon Sep 17 00:00:00 2001 From: netroms Date: Tue, 14 Nov 2023 03:29:57 +0100 Subject: [PATCH 54/63] feat: invalidate user session when user's role memberships changes (#15633) * feat: invalidate user session when user's role memberships changes --- .../hisp/dhis/user/CurrentUserService.java | 25 +++++- .../hisp/dhis/user/DefaultUserService.java | 11 +-- .../hooks/UserObjectBundleHook.java | 27 ++++++- .../hooks/UserRoleBundleHook.java | 77 +++++++++++++++++++ .../dhis/config/IntegrationTestConfig.java | 7 ++ ...estableCacheInvalidationConfiguration.java | 3 +- .../dhis/webapi/WebTestConfiguration.java | 4 +- .../webapi/controller/UserControllerTest.java | 60 +++++++++++++++ 8 files changed, 196 insertions(+), 18 deletions(-) create mode 100644 dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/objectbundle/hooks/UserRoleBundleHook.java diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/CurrentUserService.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/CurrentUserService.java index f1440683d9cd..1c560dd94c4d 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/CurrentUserService.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/CurrentUserService.java @@ -30,11 +30,14 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.hisp.dhis.cache.Cache; import org.hisp.dhis.cache.CacheProvider; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.springframework.context.annotation.Lazy; +import org.springframework.security.core.session.SessionInformation; +import org.springframework.security.core.session.SessionRegistry; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -51,11 +54,15 @@ public class CurrentUserService { private final Cache currentUserGroupInfoCache; - public CurrentUserService(@Lazy UserStore userStore, CacheProvider cacheProvider) { + private final SessionRegistry sessionRegistry; + + public CurrentUserService( + @Lazy UserStore userStore, CacheProvider cacheProvider, SessionRegistry sessionRegistry) { checkNotNull(userStore); this.userStore = userStore; this.currentUserGroupInfoCache = cacheProvider.createCurrentUserGroupInfoCache(); + this.sessionRegistry = sessionRegistry; } /** @@ -113,4 +120,20 @@ public void invalidateUserGroupCache(String userUID) { // Ignore if key doesn't exist } } + + public CurrentUserDetailsImpl getCurrentUserPrincipal(String uid) { + return sessionRegistry.getAllPrincipals().stream() + .map(CurrentUserDetailsImpl.class::cast) + .filter(principal -> principal.getUid().equals(uid)) + .findFirst() + .orElse(null); + } + + public void invalidateUserSessions(String uid) { + CurrentUserDetailsImpl principal = getCurrentUserPrincipal(uid); + if (principal != null) { + List allSessions = sessionRegistry.getAllSessions(principal, false); + allSessions.forEach(SessionInformation::expireNow); + } + } } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserService.java index eccf98da1892..66b0e741d663 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserService.java @@ -84,8 +84,6 @@ import org.hisp.dhis.util.ObjectUtils; import org.jboss.aerogear.security.otp.api.Base32; import org.springframework.context.annotation.Lazy; -import org.springframework.security.core.session.SessionInformation; -import org.springframework.security.core.session.SessionRegistry; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -108,8 +106,6 @@ public class DefaultUserService implements UserService { private final PasswordManager passwordManager; - private final SessionRegistry sessionRegistry; - private final SecurityService securityService; private final Cache userDisplayNameCache; @@ -126,7 +122,6 @@ public DefaultUserService( SystemSettingManager systemSettingManager, CacheProvider cacheProvider, @Lazy PasswordManager passwordManager, - @Lazy SessionRegistry sessionRegistry, @Lazy SecurityService securityService, AclService aclService, @Lazy OrganisationUnitService organisationUnitService) { @@ -135,7 +130,6 @@ public DefaultUserService( checkNotNull(userRoleStore); checkNotNull(systemSettingManager); checkNotNull(passwordManager); - checkNotNull(sessionRegistry); checkNotNull(securityService); checkNotNull(aclService); checkNotNull(organisationUnitService); @@ -146,7 +140,6 @@ public DefaultUserService( this.currentUserService = currentUserService; this.systemSettingManager = systemSettingManager; this.passwordManager = passwordManager; - this.sessionRegistry = sessionRegistry; this.securityService = securityService; this.userDisplayNameCache = cacheProvider.createUserDisplayNameCache(); this.aclService = aclService; @@ -798,9 +791,7 @@ public void privilegedTwoFactorDisable( @Override public void expireActiveSessions(User user) { - List sessions = sessionRegistry.getAllSessions(user, false); - - sessions.forEach(SessionInformation::expireNow); + currentUserService.invalidateUserSessions(user.getUid()); } @Override diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/objectbundle/hooks/UserObjectBundleHook.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/objectbundle/hooks/UserObjectBundleHook.java index 95f94a407361..873339424808 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/objectbundle/hooks/UserObjectBundleHook.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/objectbundle/hooks/UserObjectBundleHook.java @@ -64,6 +64,8 @@ @AllArgsConstructor public class UserObjectBundleHook extends AbstractObjectBundleHook { public static final String USERNAME = "username"; + public static final String INVALIDATE_SESSIONS_KEY = "shouldInvalidateUserSessions"; + public static final String PRE_UPDATE_USER_KEY = "preUpdateUser"; private final UserService userService; @@ -140,7 +142,6 @@ public void preCreate(User user, ObjectBundle bundle) { if (currentUser != null) { user.getCogsDimensionConstraints().addAll(currentUser.getCogsDimensionConstraints()); - user.getCatDimensionConstraints().addAll(currentUser.getCatDimensionConstraints()); } } @@ -166,7 +167,8 @@ public void postCreate(User user, ObjectBundle bundle) { public void preUpdate(User user, User persisted, ObjectBundle bundle) { if (user == null) return; - bundle.putExtras(user, "preUpdateUser", user); + bundle.putExtras(user, PRE_UPDATE_USER_KEY, user); + bundle.putExtras(persisted, INVALIDATE_SESSIONS_KEY, userRolesUpdated(user, persisted)); if (persisted.getAvatar() != null && (user.getAvatar() == null @@ -183,17 +185,34 @@ public void preUpdate(User user, User persisted, ObjectBundle bundle) { } } + private Boolean userRolesUpdated(User preUpdateUser, User persistedUser) { + Set before = + preUpdateUser.getUserRoles().stream().map(UserRole::getUid).collect(Collectors.toSet()); + Set after = + persistedUser.getUserRoles().stream().map(UserRole::getUid).collect(Collectors.toSet()); + + return !Objects.equals(before, after); + } + @Override public void postUpdate(User persistedUser, ObjectBundle bundle) { - final User preUpdateUser = (User) bundle.getExtras(persistedUser, "preUpdateUser"); + final User preUpdateUser = (User) bundle.getExtras(persistedUser, PRE_UPDATE_USER_KEY); + final Boolean invalidateSessions = + (Boolean) bundle.getExtras(persistedUser, INVALIDATE_SESSIONS_KEY); if (!StringUtils.isEmpty(preUpdateUser.getPassword())) { userService.encodeAndSetPassword(persistedUser, preUpdateUser.getPassword()); sessionFactory.getCurrentSession().update(persistedUser); } - bundle.removeExtras(persistedUser, "preUpdateUser"); userSettingService.saveUserSettings(persistedUser.getSettings(), persistedUser); + + if (Boolean.TRUE.equals(invalidateSessions)) { + currentUserService.invalidateUserSessions(persistedUser.getUid()); + } + + bundle.removeExtras(persistedUser, PRE_UPDATE_USER_KEY); + bundle.removeExtras(persistedUser, INVALIDATE_SESSIONS_KEY); } @Override diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/objectbundle/hooks/UserRoleBundleHook.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/objectbundle/hooks/UserRoleBundleHook.java new file mode 100644 index 000000000000..eff70fc918d1 --- /dev/null +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/metadata/objectbundle/hooks/UserRoleBundleHook.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.dxf2.metadata.objectbundle.hooks; + +import java.util.Objects; +import java.util.Set; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.hisp.dhis.dxf2.metadata.objectbundle.ObjectBundle; +import org.hisp.dhis.user.CurrentUserService; +import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserRole; +import org.springframework.stereotype.Component; + +/** + * @author Morten Svanæs + */ +@Component +@AllArgsConstructor +@Slf4j +public class UserRoleBundleHook extends AbstractObjectBundleHook { + + public static final String INVALIDATE_SESSION_KEY = "shouldInvalidateUserSessions"; + + private final CurrentUserService currentUserService; + + @Override + public void preUpdate(UserRole update, UserRole existing, ObjectBundle bundle) { + if (update == null) return; + bundle.putExtras(update, INVALIDATE_SESSION_KEY, userRolesUpdated(update, existing)); + } + + private Boolean userRolesUpdated(UserRole update, UserRole existing) { + Set newAuthorities = update.getAuthorities(); + Set existingAuthorities = existing.getAuthorities(); + return !Objects.equals(newAuthorities, existingAuthorities); + } + + @Override + public void postUpdate(UserRole updatedUserRole, ObjectBundle bundle) { + final Boolean invalidateSessions = + (Boolean) bundle.getExtras(updatedUserRole, INVALIDATE_SESSION_KEY); + + if (Boolean.TRUE.equals(invalidateSessions)) { + for (User user : updatedUserRole.getUsers()) { + currentUserService.invalidateUserSessions(user.getUid()); + } + } + + bundle.removeExtras(updatedUserRole, INVALIDATE_SESSION_KEY); + } +} diff --git a/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/config/IntegrationTestConfig.java b/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/config/IntegrationTestConfig.java index 9f4f1c5550ab..669acc737a5f 100644 --- a/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/config/IntegrationTestConfig.java +++ b/dhis-2/dhis-support/dhis-support-test/src/main/java/org/hisp/dhis/config/IntegrationTestConfig.java @@ -33,6 +33,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.session.SessionRegistry; +import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.ldap.authentication.LdapAuthenticator; @@ -76,6 +78,11 @@ public class IntegrationTestConfig { POSTGRES_CONTAINER.start(); } + @Bean + public static SessionRegistry sessionRegistry() { + return new SessionRegistryImpl(); + } + @Bean public LdapAuthenticator ldapAuthenticator() { return authentication -> null; diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/cache/TestableCacheInvalidationConfiguration.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/cache/TestableCacheInvalidationConfiguration.java index 7584dfe3e4f0..d9ea391a896c 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/cache/TestableCacheInvalidationConfiguration.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/cache/TestableCacheInvalidationConfiguration.java @@ -37,6 +37,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.core.annotation.Order; +import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.core.session.SessionRegistryImpl; /** @@ -51,7 +52,7 @@ @Conditional(value = CacheInvalidationEnabledCondition.class) public class TestableCacheInvalidationConfiguration { @Bean - public static SessionRegistryImpl sessionRegistry() { + public static SessionRegistry sessionRegistry() { return new SessionRegistryImpl(); } diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/WebTestConfiguration.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/WebTestConfiguration.java index 9ee325b6e56d..2b2062fc7e40 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/WebTestConfiguration.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/WebTestConfiguration.java @@ -69,7 +69,7 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.DefaultAuthenticationEventPublisher; import org.springframework.security.authentication.event.AuthenticationFailureBadCredentialsEvent; -import org.springframework.security.core.session.SessionRegistryImpl; +import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.ldap.authentication.LdapAuthenticator; import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator; @@ -123,7 +123,7 @@ @Order(10) public class WebTestConfiguration { @Bean - public static SessionRegistryImpl sessionRegistry() { + public static SessionRegistry sessionRegistry() { return new org.springframework.security.core.session.SessionRegistryImpl(); } diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/UserControllerTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/UserControllerTest.java index 943f7eda8c7c..df0ba3105186 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/UserControllerTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/UserControllerTest.java @@ -65,9 +65,12 @@ import org.hisp.dhis.security.SecurityService; import org.hisp.dhis.setting.SettingKey; import org.hisp.dhis.setting.SystemSettingManager; +import org.hisp.dhis.user.CurrentUserDetails; +import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserGroup; import org.hisp.dhis.user.UserRole; +import org.hisp.dhis.user.UserService; import org.hisp.dhis.user.sharing.Sharing; import org.hisp.dhis.user.sharing.UserAccess; import org.hisp.dhis.web.HttpStatus; @@ -81,6 +84,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.session.SessionRegistry; /** * Tests the {@link org.hisp.dhis.webapi.controller.user.UserController}. @@ -96,6 +100,12 @@ class UserControllerTest extends DhisControllerConvenienceTest { @Autowired private OrganisationUnitService organisationUnitService; + @Autowired private CurrentUserService currentUserService; + + @Autowired private SessionRegistry sessionRegistry; + + @Autowired private UserService userService; + private User peter; @Autowired ObjectMapper objectMapper; @@ -117,6 +127,56 @@ void setUp() { assertEquals("peter@pan.net", user.getEmail()); } + @Test + void updateRolesShouldInvalidateUserSessions() { + CurrentUserDetails sessionPrincipal = userService.createUserDetails(superUser); + sessionRegistry.registerNewSession("session1", sessionPrincipal); + assertFalse(sessionRegistry.getAllSessions(sessionPrincipal, false).isEmpty()); + + UserRole roleB = createUserRole("ROLE_B", "ALL"); + userService.addUserRole(roleB); + + String roleBID = userService.getUserRoleByName("ROLE_B").getUid(); + + PATCH( + "/users/" + superUser.getUid(), + "[{'op':'add','path':'/userRoles','value':[{'id':'" + roleBID + "'}]}]") + .content(HttpStatus.OK); + + assertTrue(sessionRegistry.getAllSessions(sessionPrincipal, false).isEmpty()); + } + + @Test + void updateRolesAuthoritiesShouldInvalidateUserSessions() { + CurrentUserDetails sessionPrincipal = userService.createUserDetails(superUser); + + UserRole roleB = createUserRole("ROLE_B", "ALL"); + userService.addUserRole(roleB); + + PATCH( + "/users/" + superUser.getUid(), + "[{'op':'add','path':'/userRoles','value':[{'id':'" + roleB.getUid() + "'}]}]") + .content(HttpStatus.OK); + + String roleBID = userService.getUserRoleByName("ROLE_B").getUid(); + + sessionRegistry.registerNewSession("session1", sessionPrincipal); + assertFalse(sessionRegistry.getAllSessions(sessionPrincipal, false).isEmpty()); + + PATCH( + "/userRoles/" + roleBID, + "[" + + " {" + + " 'op': 'add'," + + " 'path': '/authorities'," + + " 'value': ['NONE']" + + " }" + + "]") + .content(HttpStatus.OK); + + assertTrue(sessionRegistry.getAllSessions(sessionPrincipal, false).isEmpty()); + } + @Test void testResetToInvite() { assertStatus(HttpStatus.NO_CONTENT, POST("/users/" + peter.getUid() + "/reset")); From ba33abf6117d1ab22b60eaec2fcb5cb5ca20aa7d Mon Sep 17 00:00:00 2001 From: marc Date: Tue, 14 Nov 2023 08:46:37 +0100 Subject: [PATCH 55/63] fix: Skip user scope validation if mode ALL [TECH-1634] (#15610) * fix: Skip user scope validation if mode ALL [TECH-1634] * fix: Validate authorized users see all enrollments [TECH-1634] * fix: Skip scope validation when user is superuser [TECH-1634] * fix: Validate All mode with authority users [TECH-1634] * fix: Filter tracked entities by program in sql [TECH-1634] --- .../EnrollmentOperationParamsMapper.java | 7 +- .../aggregates/DefaultTrackedEntityStore.java | 78 ++++++++++++------- .../aggregates/TrackedEntityAggregate.java | 6 +- .../aggregates/TrackedEntityStore.java | 3 +- .../EnrollmentOperationParamsMapperTest.java | 57 ++++++++++++++ ...rackedEntityOperationParamsMapperTest.java | 61 +++++++++++++++ .../enrollment/EnrollmentServiceTest.java | 25 ++++++ .../TrackedEntityServiceTest.java | 59 +++++++++++++- 8 files changed, 256 insertions(+), 40 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapper.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapper.java index 84ee815ac6a7..a35f2d7f3a5c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapper.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapper.java @@ -137,10 +137,6 @@ private TrackedEntity validateTrackedEntity(String uid) throws BadRequestExcepti private Set validateOrgUnits(Set orgUnitUids, User user) throws BadRequestException, ForbiddenException { - Set possibleSearchOrgUnits = new HashSet<>(); - if (user != null) { - possibleSearchOrgUnits = user.getTeiSearchOrganisationUnitsWithFallback(); - } Set orgUnits = new HashSet<>(); if (orgUnitUids != null) { @@ -153,7 +149,8 @@ private Set validateOrgUnits(Set orgUnitUids, User use if (user != null && !user.isSuper() - && !organisationUnitService.isInUserHierarchy(orgUnitUid, possibleSearchOrgUnits)) { + && !organisationUnitService.isInUserHierarchy( + orgUnitUid, user.getTeiSearchOrganisationUnitsWithFallback())) { throw new ForbiddenException( "Organisation unit is not part of the search scope: " + orgUnitUid); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/DefaultTrackedEntityStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/DefaultTrackedEntityStore.java index fd3cd4e35723..e81acbea4135 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/DefaultTrackedEntityStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/DefaultTrackedEntityStore.java @@ -67,32 +67,47 @@ public class DefaultTrackedEntityStore extends AbstractStore implements TrackedE + "join trackedentity te on teop.trackedentityid = te.trackedentityid " + "where teop.trackedentityid in (:ids)"; - private static final String GET_OWNERSHIP_DATA_FOR_TE_FOR_ALL_PROGRAM = - "SELECT te.uid as te_uid,tpo.trackedentityid, tpo.programid, tpo.organisationunitid, p.accesslevel,p.uid as pgm_uid " - + "FROM trackedentityprogramowner TPO " - + "LEFT JOIN program P on P.programid = TPO.programid " - + "LEFT JOIN organisationunit OU on OU.organisationunitid = TPO.organisationunitid " - + "LEFT JOIN trackedentity TE on TE.trackedentityid = tpo.trackedentityid " - + "WHERE TPO.trackedentityid in (:ids) " - + "AND p.programid in (SELECT programid FROM program) " - + "GROUP BY te.uid,tpo.trackedentityid, tpo.programid, tpo.organisationunitid, ou.path, p.accesslevel,p.uid " - + "HAVING (P.accesslevel in ('OPEN', 'AUDITED') AND (EXISTS(SELECT SS.organisationunitid FROM userteisearchorgunits SS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = SS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')) OR EXISTS(SELECT CS.organisationunitid FROM usermembership CS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = CS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')))) " - + "OR (P.accesslevel in ('CLOSED', 'PROTECTED') AND EXISTS(SELECT CS.organisationunitid FROM usermembership CS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = CS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')));"; - - private static final String GET_OWNERSHIP_DATA_FOR_TE_FOR_SPECIFIC_PROGRAM = - "SELECT te.uid as te_uid,tpo.trackedentityid, tpo.programid, tpo.organisationunitid, p.accesslevel,p.uid as pgm_uid " - + "FROM trackedentityprogramowner TPO " - + "LEFT JOIN program P on P.programid = TPO.programid " - + "LEFT JOIN organisationunit OU on OU.organisationunitid = TPO.organisationunitid " - + "LEFT JOIN trackedentity TE on TE.trackedentityid = tpo.trackedentityid " - + "WHERE TPO.trackedentityid in (:ids) " - + "AND p.uid = :programUid " - + "GROUP BY te.uid,tpo.trackedentityid, tpo.programid, tpo.organisationunitid, ou.path, p.accesslevel,p.uid " - + "HAVING (P.accesslevel in ('OPEN', 'AUDITED') AND (EXISTS(SELECT SS.organisationunitid FROM userteisearchorgunits SS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = SS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')) OR EXISTS(SELECT CS.organisationunitid FROM usermembership CS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = CS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')))) " - + "OR (P.accesslevel in ('CLOSED', 'PROTECTED') AND EXISTS(SELECT CS.organisationunitid FROM usermembership CS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = CS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')));"; - private static final String FILTER_OUT_DELETED_TE = "te.deleted=false"; + private String getTrackedEntitiesOwnershipSqlForAllPrograms(boolean skipUserScopeValidation) { + String sql = + "SELECT te.uid as te_uid,tpo.trackedentityid, tpo.programid, tpo.organisationunitid, p.accesslevel,p.uid as pgm_uid " + + "FROM trackedentityprogramowner TPO " + + "LEFT JOIN program P on P.programid = TPO.programid " + + "LEFT JOIN organisationunit OU on OU.organisationunitid = TPO.organisationunitid " + + "LEFT JOIN trackedentity TE on TE.trackedentityid = tpo.trackedentityid " + + "WHERE TPO.trackedentityid in (:ids) " + + "AND p.programid in (SELECT programid FROM program) "; + + if (!skipUserScopeValidation) + sql += + "GROUP BY te.uid,tpo.trackedentityid, tpo.programid, tpo.organisationunitid, ou.path, p.accesslevel,p.uid " + + "HAVING (P.accesslevel in ('OPEN', 'AUDITED') AND (EXISTS(SELECT SS.organisationunitid FROM userteisearchorgunits SS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = SS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')) OR EXISTS(SELECT CS.organisationunitid FROM usermembership CS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = CS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')))) " + + "OR (P.accesslevel in ('CLOSED', 'PROTECTED') AND EXISTS(SELECT CS.organisationunitid FROM usermembership CS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = CS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')));"; + + return sql; + } + + private String getTrackedEntitiesOwnershipSqlForSpecificProgram(boolean skipUserScopeValidation) { + String sql = + "SELECT te.uid as te_uid,tpo.trackedentityid, tpo.programid, tpo.organisationunitid, p.accesslevel,p.uid as pgm_uid " + + "FROM trackedentityprogramowner TPO " + + "LEFT JOIN program P on P.programid = TPO.programid " + + "LEFT JOIN organisationunit OU on OU.organisationunitid = TPO.organisationunitid " + + "LEFT JOIN trackedentity TE on TE.trackedentityid = tpo.trackedentityid " + + "WHERE TPO.trackedentityid in (:ids) " + + "AND p.uid = :programUid "; + + if (!skipUserScopeValidation) { + sql += + "GROUP BY te.uid,tpo.trackedentityid, tpo.programid, tpo.organisationunitid, ou.path, p.accesslevel,p.uid " + + "HAVING (P.accesslevel in ('OPEN', 'AUDITED') AND (EXISTS(SELECT SS.organisationunitid FROM userteisearchorgunits SS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = SS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')) OR EXISTS(SELECT CS.organisationunitid FROM usermembership CS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = CS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')))) " + + "OR (P.accesslevel in ('CLOSED', 'PROTECTED') AND EXISTS(SELECT CS.organisationunitid FROM usermembership CS LEFT JOIN organisationunit OU2 ON OU2.organisationunitid = CS.organisationunitid WHERE userinfoid = :userInfoId AND OU.path LIKE CONCAT(OU2.path, '%')));"; + } + + return sql; + } + public DefaultTrackedEntityStore(@Qualifier("readOnlyJdbcTemplate") JdbcTemplate jdbcTemplate) { super(jdbcTemplate); } @@ -143,17 +158,22 @@ public Multimap getProgramOwners(List i } @Override - public Multimap getOwnedTeis(List ids, Context ctx) { + public Multimap getOwnedTeis( + List ids, Context ctx, boolean skipUserScopeValidation) { List> teds = Lists.partition(ids, PARITITION_SIZE); Multimap ownedTeisMultiMap = ArrayListMultimap.create(); - teds.forEach(partition -> ownedTeisMultiMap.putAll(getOwnedTeisPartitioned(partition, ctx))); + teds.forEach( + partition -> + ownedTeisMultiMap.putAll( + getOwnedTeisPartitioned(partition, ctx, skipUserScopeValidation))); return ownedTeisMultiMap; } - private Multimap getOwnedTeisPartitioned(List ids, Context ctx) { + private Multimap getOwnedTeisPartitioned( + List ids, Context ctx, boolean skipUserScopeValidation) { OwnedTeMapper handler = new OwnedTeMapper(); MapSqlParameterSource paramSource = createIdsParam(ids).addValue("userInfoId", ctx.getUserId()); @@ -165,10 +185,10 @@ private Multimap getOwnedTeisPartitioned(List ids, Context String sql; if (ctx.getQueryParams().hasProgram()) { - sql = GET_OWNERSHIP_DATA_FOR_TE_FOR_SPECIFIC_PROGRAM; + sql = getTrackedEntitiesOwnershipSqlForSpecificProgram(skipUserScopeValidation); paramSource.addValue("programUid", ctx.getQueryParams().getProgram().getUid()); } else if (checkForOwnership) { - sql = GET_OWNERSHIP_DATA_FOR_TE_FOR_ALL_PROGRAM; + sql = getTrackedEntitiesOwnershipSqlForAllPrograms(skipUserScopeValidation); } else { return ArrayListMultimap.create(); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/TrackedEntityAggregate.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/TrackedEntityAggregate.java index 83f0657d7c76..b8c8d9b2a7bf 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/TrackedEntityAggregate.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/TrackedEntityAggregate.java @@ -207,10 +207,12 @@ public List find( * Async fetch Owned Tei mapped to the provided program attributes by * TrackedEntity id */ + boolean skipScopeValidation = user.isPresent() && user.get().isSuper(); final CompletableFuture> ownedTeiAsync = conditionalAsyncFetch( - user.isPresent(), () -> trackedEntityStore.getOwnedTeis(ids, ctx), getPool()); - + user.isPresent(), + () -> trackedEntityStore.getOwnedTeis(ids, ctx, skipScopeValidation), + getPool()); /* * Execute all queries and merge the results */ diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/TrackedEntityStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/TrackedEntityStore.java index 13abdf45d663..ace3f14843b6 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/TrackedEntityStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/aggregates/TrackedEntityStore.java @@ -79,5 +79,6 @@ public interface TrackedEntityStore { * @param ctx aggregate context * @return Tei uids mapped to a list of program uids to which user has ownership */ - Multimap getOwnedTeis(List ids, Context ctx); + Multimap getOwnedTeis( + List ids, Context ctx, boolean skipUserScopeValidation); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java index 963676a78bde..c5daf36b09a9 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentOperationParamsMapperTest.java @@ -28,7 +28,9 @@ package org.hisp.dhis.tracker.export.enrollment; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.SELECTED; +import static org.hisp.dhis.security.Authorities.F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS; import static org.hisp.dhis.utils.Assertions.assertContainsOnly; import static org.hisp.dhis.utils.Assertions.assertIsEmpty; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -38,6 +40,7 @@ import java.util.List; import java.util.Set; +import org.hisp.dhis.common.BaseIdentifiableObject; import org.hisp.dhis.feedback.BadRequestException; import org.hisp.dhis.feedback.ForbiddenException; import org.hisp.dhis.organisationunit.OrganisationUnit; @@ -52,6 +55,7 @@ import org.hisp.dhis.tracker.export.Order; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserRole; import org.hisp.dhis.webapi.controller.event.mapper.SortDirection; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -203,6 +207,59 @@ void shouldThrowExceptionWhenOrgUnitNotInScope() { exception.getMessage()); } + @Test + void shouldMapParamsWhenOrgUnitNotInScopeButUserIsSuperuser() + throws ForbiddenException, BadRequestException { + User superuser = createUser("ALL"); + when(currentUserService.getCurrentUser()).thenReturn(superuser); + + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder() + .orgUnitUids(Set.of(ORG_UNIT_1_UID)) + .orgUnitMode(ALL) + .build(); + when(organisationUnitService.isInUserHierarchy( + orgUnit1.getUid(), user.getTeiSearchOrganisationUnitsWithFallback())) + .thenReturn(false); + + EnrollmentQueryParams queryParams = mapper.map(operationParams); + assertContainsOnly( + operationParams.getOrgUnitUids(), + queryParams.getOrganisationUnits().stream().map(BaseIdentifiableObject::getUid).toList()); + assertEquals(operationParams.getOrgUnitMode(), queryParams.getOrganisationUnitMode()); + } + + @Test + void shouldFailWhenOrgUnitNotInScopeAndUserHasSearchInAllAuthority() { + + User user = createUser(F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS.name()); + user.setTeiSearchOrganisationUnits(Set.of(orgUnit2)); + when(currentUserService.getCurrentUser()).thenReturn(user); + + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder() + .orgUnitUids(Set.of(ORG_UNIT_1_UID)) + .orgUnitMode(SELECTED) + .build(); + when(organisationUnitService.isInUserHierarchy( + orgUnit1.getUid(), this.user.getTeiSearchOrganisationUnitsWithFallback())) + .thenReturn(false); + + Exception exception = assertThrows(ForbiddenException.class, () -> mapper.map(operationParams)); + assertEquals( + "Organisation unit is not part of the search scope: " + ORG_UNIT_1_UID, + exception.getMessage()); + } + + private User createUser(String authority) { + User user = new User(); + UserRole userRole = new UserRole(); + userRole.setAuthorities(Set.of(authority)); + user.setUserRoles(Set.of(userRole)); + + return user; + } + @Test void shouldMapProgramWhenProgramUidIsSpecified() throws BadRequestException, ForbiddenException { EnrollmentOperationParams requestParams = diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityOperationParamsMapperTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityOperationParamsMapperTest.java index 330ad78f4f97..95085c29d3fc 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityOperationParamsMapperTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityOperationParamsMapperTest.java @@ -32,6 +32,7 @@ import static org.hisp.dhis.DhisConvenienceTest.getDate; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.DESCENDANTS; +import static org.hisp.dhis.security.Authorities.F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS; import static org.hisp.dhis.util.DateUtils.parseDate; import static org.hisp.dhis.utils.Assertions.assertContainsOnly; import static org.hisp.dhis.utils.Assertions.assertStartsWith; @@ -72,11 +73,14 @@ import org.hisp.dhis.tracker.export.Order; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserRole; import org.hisp.dhis.webapi.controller.event.mapper.SortDirection; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.function.Executable; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -473,6 +477,63 @@ void shouldThrowExceptionWhenOrgUnitNotInScope() { "Organisation unit is not part of the search scope: " + ORG_UNIT_1_UID, e.getMessage()); } + @ParameterizedTest + @EnumSource(value = OrganisationUnitSelectionMode.class) + void shouldMapParamsWhenOrgUnitNotInScopeButUserIsSuperuser( + OrganisationUnitSelectionMode orgUnitMode) throws ForbiddenException, BadRequestException { + when(organisationUnitService.isInUserHierarchy( + orgUnit1.getUid(), user.getTeiSearchOrganisationUnitsWithFallback())) + .thenReturn(false); + + User superuser = createUser("ALL"); + + TrackedEntityOperationParams operationParams = + TrackedEntityOperationParams.builder() + .orgUnitMode(orgUnitMode) + .user(superuser) + .organisationUnits(Set.of(ORG_UNIT_1_UID)) + .build(); + + TrackedEntityQueryParams queryParams = mapper.map(operationParams); + assertEquals(user, queryParams.getUser()); + assertContainsOnly( + Set.of(ORG_UNIT_1_UID), + queryParams.getOrgUnits().stream().map(BaseIdentifiableObject::getUid).toList()); + assertEquals(orgUnitMode, queryParams.getOrgUnitMode()); + } + + @ParameterizedTest + @EnumSource(value = OrganisationUnitSelectionMode.class) + void shouldFailWhenOrgUnitNotInScopeAndUserHasSearchInAllAuthority( + OrganisationUnitSelectionMode orgUnitMode) { + when(organisationUnitService.isInUserHierarchy( + orgUnit1.getUid(), user.getTeiSearchOrganisationUnitsWithFallback())) + .thenReturn(false); + + User user = createUser(F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS.name()); + + TrackedEntityOperationParams operationParams = + TrackedEntityOperationParams.builder() + .orgUnitMode(orgUnitMode) + .user(user) + .organisationUnits(Set.of(ORG_UNIT_1_UID)) + .build(); + + ForbiddenException e = + assertThrows(ForbiddenException.class, () -> mapper.map(operationParams)); + assertEquals( + "Organisation unit is not part of the search scope: " + ORG_UNIT_1_UID, e.getMessage()); + } + + private User createUser(String authority) { + User user = new User(); + UserRole userRole = new UserRole(); + userRole.setAuthorities(Set.of(authority)); + user.setUserRoles(Set.of(userRole)); + + return user; + } + @Test void testMappingAssignedUsers() throws BadRequestException, ForbiddenException { TrackedEntityOperationParams operationParams = diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java index a9b1dbfa1a8a..16a5384db249 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.tracker.export.enrollment; +import static java.util.Collections.emptySet; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; @@ -89,6 +90,8 @@ class EnrollmentServiceTest extends TransactionalIntegrationTest { private User userWithoutOrgUnit; + private User authorizedUser; + private Program programA; private ProgramStage programStageA; @@ -131,6 +134,13 @@ protected void setUpTest() throws Exception { createAndAddUser(false, "user", Set.of(orgUnitA), Set.of(orgUnitA), "F_EXPORT_DATA"); user.setTeiSearchOrganisationUnits(Set.of(orgUnitA, orgUnitB, orgUnitC)); userWithoutOrgUnit = createUserWithAuth("userWithoutOrgUnit"); + authorizedUser = + createAndAddUser( + false, + "test user", + Set.of(orgUnitA, orgUnitB, orgUnitC), + emptySet(), + "F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS"); trackedEntityTypeA = createTrackedEntityType('A'); trackedEntityTypeA.getSharing().setOwner(user); @@ -613,6 +623,21 @@ void shouldReturnEmptyIfEnrollmentEndedBeforePassedDateAndTime() assertIsEmpty(enrollments); } + @Test + void shouldReturnAllEnrollmentsWhenModeAllAndUserAuthorizedAndInSearchScope() + throws ForbiddenException, BadRequestException, NotFoundException { + + injectSecurityContext(authorizedUser); + + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder().orgUnitMode(ALL).build(); + + List enrollments = enrollmentService.getEnrollments(operationParams); + assertContainsOnly( + List.of(enrollmentA.getUid(), enrollmentB.getUid(), enrollmentChildA.getUid()), + uids(enrollments)); + } + @Test void shouldFailWhenOrgUnitModeAllAndUserNotAuthorized() { EnrollmentOperationParams operationParams = diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java index c1f671d8f381..0345d5bbc338 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java @@ -27,6 +27,7 @@ */ package org.hisp.dhis.tracker.export.trackedentity; +import static java.util.Collections.emptySet; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.DESCENDANTS; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.SELECTED; @@ -133,12 +134,16 @@ class TrackedEntityServiceTest extends IntegrationTestBase { private User admin; + private User authorizedUser; + private OrganisationUnit orgUnitA; private OrganisationUnit orgUnitB; private TrackedEntityAttribute teaA; + private TrackedEntityAttribute teaC; + private TrackedEntityType trackedEntityTypeA; private Program programA; @@ -159,6 +164,8 @@ class TrackedEntityServiceTest extends IntegrationTestBase { private TrackedEntity trackedEntityB; + private TrackedEntity trackedEntityC; + private Note note; private CategoryOptionCombo defaultCategoryOptionCombo; @@ -194,6 +201,15 @@ protected void setUpTest() throws Exception { user = createAndAddUser(false, "user", Set.of(orgUnitA), Set.of(orgUnitA), "F_EXPORT_DATA"); user.setTeiSearchOrganisationUnits(Set.of(orgUnitA, orgUnitB, orgUnitC)); + authorizedUser = + createAndAddUser( + false, + "authorizedUser", + Set.of(orgUnitA, orgUnitB, orgUnitC), + emptySet(), + "F_TRACKED_ENTITY_INSTANCE_SEARCH_IN_ALL_ORGUNITS"); + authorizedUser.setTeiSearchOrganisationUnits(Set.of(orgUnitA, orgUnitB, orgUnitC)); + userWithSearchInAllAuthority = createAndAddUser( false, @@ -208,7 +224,7 @@ protected void setUpTest() throws Exception { manager.save(teaA, false); TrackedEntityAttribute teaB = createTrackedEntityAttribute('B', ValueType.TEXT); manager.save(teaB, false); - TrackedEntityAttribute teaC = createTrackedEntityAttribute('C', ValueType.TEXT); + teaC = createTrackedEntityAttribute('C', ValueType.TEXT); manager.save(teaC, false); TrackedEntityAttribute teaD = createTrackedEntityAttribute('D', ValueType.TEXT); manager.save(teaD, false); @@ -247,7 +263,10 @@ protected void setUpTest() throws Exception { Stream.of(programStageA1, programStageA2).collect(Collectors.toCollection(HashSet::new))); programA.getSharing().setOwner(admin); programA.getSharing().setPublicAccess(AccessStringHelper.FULL); - programA.getProgramAttributes().add(new ProgramTrackedEntityAttribute(programA, teaC)); + ProgramTrackedEntityAttribute programTrackedEntityAttribute = + new ProgramTrackedEntityAttribute(programA, teaC); + programTrackedEntityAttribute.setSearchable(true); + programA.getProgramAttributes().add(programTrackedEntityAttribute); manager.update(programA); User currentUser = currentUserService.getCurrentUser(); @@ -333,7 +352,7 @@ protected void setUpTest() throws Exception { trackedEntityB.setTrackedEntityType(trackedEntityTypeA); manager.save(trackedEntityB, false); - TrackedEntity trackedEntityC = createTrackedEntity(orgUnitC); + trackedEntityC = createTrackedEntity(orgUnitC); trackedEntityC.setTrackedEntityType(trackedEntityTypeA); manager.save(trackedEntityC, false); @@ -1389,6 +1408,40 @@ void shouldReturnTrackedEntityRelationshipsWithTei2Event() () -> assertEquals(eventA.getUid(), actual.getTo().getEvent().getUid())); } + @Test + void shouldReturnAllEntitiesWhenSuperuserAndNotInSearchScope() + throws ForbiddenException, BadRequestException, NotFoundException { + injectSecurityContext(admin); + + TrackedEntityOperationParams operationParams = + TrackedEntityOperationParams.builder() + .orgUnitMode(ALL) + .user(admin) + .programUid(programA.getUid()) + .filters(Map.of(teaC.getUid(), List.of(new QueryFilter(QueryOperator.LIKE, "C")))) + .build(); + + List trackedEntities = trackedEntityService.getTrackedEntities(operationParams); + assertContainsOnly(List.of(trackedEntityA), trackedEntities); + } + + @Test + void shouldReturnAllEntitiesWhenAuthorizedUserAndInSearchScope() + throws ForbiddenException, BadRequestException, NotFoundException { + injectSecurityContext(authorizedUser); + + TrackedEntityOperationParams operationParams = + TrackedEntityOperationParams.builder() + .orgUnitMode(ALL) + .user(authorizedUser) + .trackedEntityTypeUid(trackedEntityTypeA.getUid()) + .build(); + + List trackedEntities = trackedEntityService.getTrackedEntities(operationParams); + + assertContainsOnly(List.of(trackedEntityA, trackedEntityB, trackedEntityC), trackedEntities); + } + @Test void shouldFailWhenModeAllUserCanSearchEverywhereButNotSuperuserAndNoAccessToProgram() { injectSecurityContext(userWithSearchInAllAuthority); From b50c5e692bfe5f980f4cd6e84d7d7fdff7daa481 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 08:02:28 +0000 Subject: [PATCH 56/63] chore(deps): bump micrometer.version from 1.11.5 to 1.12.0 in /dhis-2 (#15678) Bumps `micrometer.version` from 1.11.5 to 1.12.0. Updates `io.micrometer:micrometer-registry-prometheus` from 1.11.5 to 1.12.0 - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.11.5...v1.12.0) Updates `io.micrometer:micrometer-core` from 1.11.5 to 1.12.0 - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.11.5...v1.12.0) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-prometheus dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.micrometer:micrometer-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 098d2f1aa577..30c38e63f921 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -203,7 +203,7 @@ 1.3.20 - 1.11.5 + 1.12.0 2.21.1 From 74ac13d52c7670710461647fca1bf9807ece9bc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 08:03:29 +0000 Subject: [PATCH 57/63] chore(deps): bump io.netty:netty-all in /dhis-2 (#15659) Bumps [io.netty:netty-all](https://github.com/netty/netty) from 4.1.100.Final to 4.1.101.Final. - [Commits](https://github.com/netty/netty/compare/netty-4.1.100.Final...netty-4.1.101.Final) --- updated-dependencies: - dependency-name: io.netty:netty-all dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dhis-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 30c38e63f921..22dcd0e7b27e 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -165,7 +165,7 @@ 2.31.2 - 4.1.100.Final + 4.1.101.Final 4.8.164 From 1d0602a6a7c9f5a43a3cdedd8404b7485b275064 Mon Sep 17 00:00:00 2001 From: Enrico Colasante Date: Tue, 14 Nov 2023 09:49:32 +0100 Subject: [PATCH 58/63] chore: Rename executiondate to occurreddate in DB [TECH-1615] (#15648) * chore: Rename executiondate to occurreddate in DB [TECH-1615] * Update dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/params/dimension/DimensionParam.java --- .../org/hisp/dhis/analytics/TimeField.java | 2 +- .../dhis/program/AnalyticsPeriodBoundary.java | 2 +- .../ProgramIndicatorSubqueryBuilder.java | 2 +- .../data/DefaultEventDataQueryService.java | 2 +- .../data/EnrollmentTimeFieldSqlRenderer.java | 4 +- .../data/JdbcEnrollmentAnalyticsManager.java | 8 +- .../event/data/JdbcEventAnalyticsManager.java | 2 +- .../table/JdbcEventAnalyticsTableManager.java | 4 +- .../JdbcTeiEventsAnalyticsTableManager.java | 2 +- .../context/querybuilder/ContextUtils.java | 2 +- .../ProgramIndicatorQueryBuilder.java | 2 +- .../data/EnrollmentAnalyticsManagerTest.java | 32 +++---- .../event/data/EventAnalyticsManagerTest.java | 16 ++-- .../event/data/TimeFieldSqlRendererTest.java | 6 +- .../JdbcEventAnalyticsTableManagerTest.java | 2 +- .../hisp/dhis/period/PeriodDataProvider.java | 2 +- .../dataitem/ProgramItemPsEventdate.java | 2 +- .../function/ProgramMinMaxFunction.java | 2 +- .../dhis/program/variable/vEventDate.java | 6 +- .../dhis/program/variable/vScheduledDate.java | 2 +- .../HibernateTrackedEntityStore.java | 4 +- .../dhis/program/hibernate/Enrollment.hbm.xml | 2 +- .../hisp/dhis/program/hibernate/Event.hbm.xml | 2 +- .../ProgramSqlGeneratorFunctionsTest.java | 20 ++--- .../ProgramSqlGeneratorVariablesTest.java | 6 +- .../tracker/event/AbstractEventService.java | 9 +- .../tracker/event/JdbcEventStore.java | 20 ++--- .../context/ProgramStageInstanceSupplier.java | 4 +- .../AttributeOptionComboDateCheck.java | 6 +- .../trackedentity/store/query/EventQuery.java | 2 +- .../dhis/tracker/export/event/EventQuery.java | 2 +- .../tracker/export/event/JdbcEventStore.java | 20 ++--- .../HibernateTrackedEntityStore.java | 12 +-- .../mapper/EventRowCallbackHandler.java | 2 +- .../aggregates/query/EventQuery.java | 2 +- ...xecutionDateToOccurredDateInEventTable.sql | 11 +++ .../AbstractStatementBuilder.java | 6 +- .../event/data/EventDataQueryServiceTest.java | 2 +- ...ProgramIndicatorServiceD2FunctionTest.java | 88 +++++++++---------- .../program/ProgramIndicatorServiceTest.java | 8 +- .../ProgramIndicatorServiceVariableTest.java | 16 ++-- .../tracker/event_and_enrollment.json | 1 - 42 files changed, 178 insertions(+), 169 deletions(-) create mode 100644 dhis-2/dhis-support/dhis-support-db-migration/src/main/resources/org/hisp/dhis/db/migration/2.41/V2_41_36__RenameExecutionDateToOccurredDateInEventTable.sql diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/TimeField.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/TimeField.java index 03d3fe774034..a494aa664357 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/TimeField.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/analytics/TimeField.java @@ -40,7 +40,7 @@ /** Enum that maps database column names to their respective "business" names. */ public enum TimeField { - EVENT_DATE("executiondate"), + EVENT_DATE("occurreddate"), ENROLLMENT_DATE("enrollmentdate"), INCIDENT_DATE("incidentdate"), // Not a typo, different naming convention between FE and database diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/AnalyticsPeriodBoundary.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/AnalyticsPeriodBoundary.java index 75dd0fff3c17..74acf6024dd4 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/AnalyticsPeriodBoundary.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/AnalyticsPeriodBoundary.java @@ -92,7 +92,7 @@ public class AnalyticsPeriodBoundary extends BaseIdentifiableObject implements E public static final Pattern COHORT_HAVING_ATTRIBUTE_PATTERN = Pattern.compile(COHORT_HAVING_ATTRIBUTE_REGEX); - public static final String DB_EVENT_DATE = "executiondate"; + public static final String DB_EVENT_DATE = "occurreddate"; public static final String DB_ENROLLMENT_DATE = "enrollmentdate"; diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/ProgramIndicatorSubqueryBuilder.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/ProgramIndicatorSubqueryBuilder.java index 1c6c4ecf192d..1d551f283a05 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/ProgramIndicatorSubqueryBuilder.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/common/ProgramIndicatorSubqueryBuilder.java @@ -55,7 +55,7 @@ * An example of a generated sub-query is: * *

- * avg((date_part('year', age(cast(executiondate as date), cast("iESIqZ0R0R0" as date)))))
+ * avg((date_part('year', age(cast(occurreddate as date), cast("iESIqZ0R0R0" as date)))))
  * FROM analytics_event_uy2gu8kt1jf as subax"
  * 
* diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java index 8fda325d19c3..d1b5044cc634 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventDataQueryService.java @@ -118,7 +118,7 @@ public class DefaultEventDataQueryService implements EventDataQueryService { private static final String COL_NAME_EVENT_STATUS = "psistatus"; - private static final String COL_NAME_EVENTDATE = "executiondate"; + private static final String COL_NAME_EVENTDATE = "occurreddate"; private static final String COL_NAME_ENROLLMENTDATE = "enrollmentdate"; diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EnrollmentTimeFieldSqlRenderer.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EnrollmentTimeFieldSqlRenderer.java index 11602c4a43a7..1bdb16019bf3 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EnrollmentTimeFieldSqlRenderer.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/EnrollmentTimeFieldSqlRenderer.java @@ -144,11 +144,11 @@ private String getProgramIndicatorEventInProgramStageSql( + eventTableName + ".pi = " + ANALYTICS_TBL_ALIAS - + ".pi and executiondate is not null "; + + ".pi and occurreddate is not null "; for (AnalyticsPeriodBoundary boundary : boundaries) { sql += - " and executiondate " + " and occurreddate " + (boundary.getAnalyticsPeriodBoundaryType().isStartBoundary() ? ">=" : "<") + " cast( '" + format.format(boundary.getBoundaryDate(reportingStartDate, reportingEndDate)) diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEnrollmentAnalyticsManager.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEnrollmentAnalyticsManager.java index 267f704f6e23..148465eec7a4 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEnrollmentAnalyticsManager.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEnrollmentAnalyticsManager.java @@ -91,7 +91,7 @@ public class JdbcEnrollmentAnalyticsManager extends AbstractJdbcEventAnalyticsMa private static final String ANALYTICS_EVENT = "analytics_event_"; - private static final String ORDER_BY_EXECUTION_DATE = "order by executiondate "; + private static final String ORDER_BY_EXECUTION_DATE = "order by occurreddate "; private static final String LIMIT_1 = "limit 1"; @@ -553,7 +553,7 @@ protected String getColumn(QueryItem item, String suffix) { && !item.getRepeatableStageParams().simpleStageValueExpected()) { return "(select json_agg(t1) from (select " + colName - + ", incidentdate, scheduleddate, executiondate " + + ", incidentdate, scheduleddate, occurreddate " + " from " + eventTableName + " where " @@ -640,14 +640,14 @@ private static String getExecutionDateFilter(Date startDate, Date endDate) { StringBuilder sb = new StringBuilder(); if (startDate != null) { - sb.append(" and executiondate >= "); + sb.append(" and occurreddate >= "); sb.append( String.format("%s ", SqlUtils.singleQuote(DateUtils.getMediumDateString(startDate)))); } if (endDate != null) { - sb.append(" and executiondate <= "); + sb.append(" and occurreddate <= "); sb.append(String.format("%s ", SqlUtils.singleQuote(DateUtils.getMediumDateString(endDate)))); } diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java index de170a7b5a4b..0464afc06a7c 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java @@ -319,7 +319,7 @@ protected String getSelectClause(EventQueryParams params) { .add( "psi", "ps", - "executiondate", + "occurreddate", "storedby", "createdbydisplayname", "lastupdatedbydisplayname", diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java index 3c3b1e515992..242f5220926d 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManager.java @@ -141,7 +141,7 @@ public JdbcEventAnalyticsTableManager( new AnalyticsTableColumn(quote("ao"), CHARACTER_11, NOT_NULL, "ao.uid"), new AnalyticsTableColumn(quote("enrollmentdate"), TIMESTAMP, "pi.enrollmentdate"), new AnalyticsTableColumn(quote("incidentdate"), TIMESTAMP, "pi.incidentdate"), - new AnalyticsTableColumn(quote("executiondate"), TIMESTAMP, "psi.executiondate"), + new AnalyticsTableColumn(quote("occurreddate"), TIMESTAMP, "psi.occurreddate"), new AnalyticsTableColumn(quote("scheduleddate"), TIMESTAMP, "psi.scheduleddate"), new AnalyticsTableColumn(quote("completeddate"), TIMESTAMP, "psi.completeddate"), @@ -262,7 +262,7 @@ public List getAnalyticsTables(AnalyticsTableUpdateParams params * status */ static String getDateLinkedToStatus() { - return "CASE WHEN 'SCHEDULE' = psi.status THEN psi.scheduleddate ELSE psi.executiondate END"; + return "CASE WHEN 'SCHEDULE' = psi.status THEN psi.scheduleddate ELSE psi.occurreddate END"; } /** diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcTeiEventsAnalyticsTableManager.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcTeiEventsAnalyticsTableManager.java index 608cb0f1d7f5..8790957e2988 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcTeiEventsAnalyticsTableManager.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/table/JdbcTeiEventsAnalyticsTableManager.java @@ -134,7 +134,7 @@ public JdbcTeiEventsAnalyticsTableManager( new AnalyticsTableColumn(quote("programinstanceuid"), CHARACTER_11, NULL, "pi.uid"), new AnalyticsTableColumn(quote("programstageuid"), CHARACTER_11, NULL, "ps.uid"), new AnalyticsTableColumn(quote("programstageinstanceuid"), CHARACTER_11, NULL, "psi.uid"), - new AnalyticsTableColumn(quote("executiondate"), TIMESTAMP, "psi.executiondate"), + new AnalyticsTableColumn(quote("occurreddate"), TIMESTAMP, "psi.occurreddate"), new AnalyticsTableColumn(quote("lastupdated"), TIMESTAMP, "psi.lastupdated"), new AnalyticsTableColumn(quote("created"), TIMESTAMP, "psi.created"), new AnalyticsTableColumn(quote("scheduleddate"), TIMESTAMP, "psi.scheduleddate"), diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/ContextUtils.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/ContextUtils.java index 18e48109d04b..63d0795b47ef 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/ContextUtils.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/ContextUtils.java @@ -73,7 +73,7 @@ static String eventSelect( SqlParameterManager sqlParameterManager) { return "select innermost_evt.*" + " from (select *," - + " row_number() over (partition by programinstanceuid order by executiondate desc) as rn" + + " row_number() over (partition by programinstanceuid order by occurreddate desc) as rn" + " from " + ANALYTICS_TEI_EVT + trackedEntityType.getUid().toLowerCase() diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/ProgramIndicatorQueryBuilder.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/ProgramIndicatorQueryBuilder.java index 582f0fe6345d..7a3089f2ec23 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/ProgramIndicatorQueryBuilder.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/tei/query/context/querybuilder/ProgramIndicatorQueryBuilder.java @@ -260,7 +260,7 @@ static String eventProgramIndicatorSelect( + ", " + expression + " as value, " - + " row_number() over (partition by pi order by executiondate desc) as rn " + + " row_number() over (partition by pi order by occurreddate desc) as rn " + " from analytics_event_" + program.getElement().getUid() + " as " diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EnrollmentAnalyticsManagerTest.java b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EnrollmentAnalyticsManagerTest.java index c8a2d60e945f..eb23f86e6a7f 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EnrollmentAnalyticsManagerTest.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EnrollmentAnalyticsManagerTest.java @@ -214,7 +214,7 @@ private void verifyWithProgramStageAndDataElement(ValueType valueType) { + programA.getUid() + ".pi = ax.pi and \"fWIAEtYVEGk\" is not null and ps = '" + programStage.getUid() - + "' order by executiondate desc limit 1 )"; + + "' order by occurreddate desc limit 1 )"; if (valueType == ValueType.NUMBER) { subSelect = subSelect + " as \"fWIAEtYVEGk\""; @@ -257,7 +257,7 @@ private void verifyWithRepeatableProgramStageAndDataElement(ValueType valueType) + programUid + ".pi = ax.pi and ps = '" + repeatableProgramStage.getUid() - + "' order by executiondate desc offset 1 limit 1 ) " + + "' order by occurreddate desc offset 1 limit 1 ) " + "as \"" + programStageUid + "[-1]." @@ -272,7 +272,7 @@ private void verifyWithRepeatableProgramStageAndDataElement(ValueType valueType) + programUid + ".pi = ax.pi and ps = '" + programStageUid - + "' order by executiondate desc offset 1 limit 1 )) " + + "' order by occurreddate desc offset 1 limit 1 )) " + "as \"" + programStageUid + "[-1]." @@ -303,7 +303,7 @@ void verifyWithProgramStageAndTextualDataElementAndFilter() { + programA.getUid() + ".pi = ax.pi and \"fWIAEtYVEGk\" is not null and ps = '" + programStage.getUid() - + "' order by executiondate desc limit 1 )"; + + "' order by occurreddate desc limit 1 )"; String expected = "ax.\"quarterly\",ax.\"ou\"," @@ -377,7 +377,7 @@ void verifyWithProgramStageAndNumericDataElementAndFilter2() { + programA.getUid() + ".pi = ax.pi and \"fWIAEtYVEGk\" is not null and ps = '" + programStage.getUid() - + "' order by executiondate desc limit 1 )"; + + "' order by occurreddate desc limit 1 )"; String expected = "ax.\"quarterly\",ax.\"ou\"," @@ -404,7 +404,7 @@ void verifyGetEnrollmentsWithMissingValueEqFilter() { + programA.getUid() + ".pi = ax.pi and \"fWIAEtYVEGk\" is not null and ps = '" + programStage.getUid() - + "' order by executiondate desc limit 1 )"; + + "' order by occurreddate desc limit 1 )"; String expected = subSelect + " is null"; @@ -423,7 +423,7 @@ void verifyGetEnrollmentsWithMissingValueNeqFilter() { + programA.getUid() + ".pi = ax.pi and \"fWIAEtYVEGk\" is not null and ps = '" + programStage.getUid() - + "' order by executiondate desc limit 1 )"; + + "' order by occurreddate desc limit 1 )"; String expected = subSelect + " is not null"; testIt( @@ -441,7 +441,7 @@ void verifyGetEnrollmentsWithMissingValueAndNumericValuesInFilter() { + programA.getUid() + ".pi = ax.pi and \"fWIAEtYVEGk\" is not null and ps = '" + programStage.getUid() - + "' order by executiondate desc limit 1 )"; + + "' order by occurreddate desc limit 1 )"; String numericValues = String.join(OPTION_SEP, "10", "11", "12"); String expected = @@ -467,7 +467,7 @@ void verifyGetEnrollmentsWithoutMissingValueAndNumericValuesInFilter() { + programA.getUid() + ".pi = ax.pi and \"fWIAEtYVEGk\" is not null and ps = '" + programStage.getUid() - + "' order by executiondate desc limit 1 )"; + + "' order by occurreddate desc limit 1 )"; String numericValues = String.join(OPTION_SEP, "10", "11", "12"); String expected = subSelect + " in (" + String.join(",", numericValues.split(OPTION_SEP)) + ")"; @@ -486,7 +486,7 @@ void verifyGetEnrollmentsWithOnlyMissingValueInFilter() { + programA.getUid() + ".pi = ax.pi and \"fWIAEtYVEGk\" is not null and ps = '" + programStage.getUid() - + "' order by executiondate desc limit 1 )"; + + "' order by occurreddate desc limit 1 )"; String expected = subSelect + " is null"; String unexpected = "(" + subSelect + " in ("; @@ -718,7 +718,7 @@ void verifyGetColumnOfTypeCoordinateAndWithProgramStages() { + dataElementA.getUid() + "\" is not null and ps = '" + programStage.getUid() - + "' order by executiondate desc limit 1 )")); + + "' order by occurreddate desc limit 1 )")); } @Test @@ -744,13 +744,13 @@ void verifyGetColumnOfTypeCoordinateAndWithProgramStagesAndParamsWithReferenceTy is( "(select json_agg(t1) from (select \"" + dataElementA.getUid() - + "\", incidentdate, scheduleddate, executiondate from analytics_event_" + + "\", incidentdate, scheduleddate, occurreddate from analytics_event_" + programB.getUid() + " where analytics_event_" + programB.getUid() + ".pi = ax.pi and ps = '" + repeatableProgramStage.getUid() - + "' and executiondate >= '2022-01-01' and executiondate <= '2022-01-31' order by executiondate desc LIMIT 100 ) as t1)")); + + "' and occurreddate >= '2022-01-01' and occurreddate <= '2022-01-31' order by occurreddate desc LIMIT 100 ) as t1)")); } @Test @@ -780,7 +780,7 @@ void verifyGetColumnOfTypeCoordinateAndWithProgramStagesAndParamsWithNumberTypeV + programB.getUid() + ".pi = ax.pi and ps = '" + repeatableProgramStage.getUid() - + "' order by executiondate desc limit 1 )")); + + "' order by occurreddate desc limit 1 )")); } @Test @@ -816,7 +816,7 @@ void verifyGetCoordinateColumnAndNoProgramStage() { + "and " + colName + " is not null " - + "order by executiondate " + + "order by occurreddate " + "desc limit 1 )")); } @@ -856,7 +856,7 @@ void verifyGetCoordinateColumnWithProgramStage() { + " is not null " + "and ps = '" + item.getProgramStage().getUid() - + "' order by executiondate " + + "' order by occurreddate " + "desc limit 1 )")); } diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsManagerTest.java b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsManagerTest.java index 0e53b0b1d3c6..aa9e05281878 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsManagerTest.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventAnalyticsManagerTest.java @@ -115,7 +115,7 @@ class EventAnalyticsManagerTest extends EventAnalyticsTest { private static final String TABLE_NAME = "analytics_event"; private static final String DEFAULT_COLUMNS_WITH_REGISTRATION = - "psi,ps,executiondate,storedby," + "psi,ps,occurreddate,storedby," + "createdbydisplayname" + "," + "lastupdatedbydisplayname" @@ -153,7 +153,7 @@ void verifyGetEventSqlWithProgramWithNoRegistration() { verify(jdbcTemplate).queryForRowSet(sql.capture()); String expected = - "select psi,ps,executiondate,storedby," + "select psi,ps,occurreddate,storedby," + "createdbydisplayname" + "," + "lastupdatedbydisplayname" @@ -214,7 +214,7 @@ void verifyGetEventSqlWithOrgUnitTypeDataElement() { verify(jdbcTemplate).queryForRowSet(sql.capture()); String expected = - "select psi,ps,executiondate,storedby," + "select psi,ps,occurreddate,storedby," + "createdbydisplayname" + "," + "lastupdatedbydisplayname" @@ -563,9 +563,9 @@ void verifyLastLastOrgUnitAggregationTypeSubquery() { "from (select \"psi\",ax.\"deabcdefghX\",\"ou\"," + "\"monthly\",\"jkYhtGth12t\"," + "row_number() over (partition by ax.\"ou\",ax.\"jkYhtGth12t\" " - + "order by ax.\"executiondate\" desc, ax.\"created\" desc) as pe_rank " + + "order by ax.\"occurreddate\" desc, ax.\"created\" desc) as pe_rank " + "from analytics_event_prabcdefghA as ax " - + "where ax.\"executiondate\" >= '2012-01-31' and ax.\"executiondate\" <= '2022-01-31' " + + "where ax.\"occurreddate\" >= '2012-01-31' and ax.\"occurreddate\" <= '2022-01-31' " + "and ax.\"deabcdefghX\" is not null)"; assertThat(params.isAggregationType(AggregationType.LAST), is(true)); @@ -648,15 +648,15 @@ private void verifyFirstOrLastAggregationTypeSubquery( "from (select \"psi\",ax.\"" + deU.getUid() + "\",\"quarterly\",\"ou\"," - + "row_number() over (partition by ax.\"ou\",ax.\"ao\" order by ax.\"executiondate\" " + + "row_number() over (partition by ax.\"ou\",ax.\"ao\" order by ax.\"occurreddate\" " + order + ", ax.\"created\" " + order + ") as pe_rank " + "from " + getTable(programA.getUid()) - + " as ax where ax.\"executiondate\" >= '1990-03-31' " - + "and ax.\"executiondate\" <= '2000-03-31' and ax.\"" + + " as ax where ax.\"occurreddate\" >= '1990-03-31' " + + "and ax.\"occurreddate\" <= '2000-03-31' and ax.\"" + deU.getUid() + "\" is not null)"; diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/TimeFieldSqlRendererTest.java b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/TimeFieldSqlRendererTest.java index 359ba86e483a..db5b505abb0f 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/TimeFieldSqlRendererTest.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/TimeFieldSqlRendererTest.java @@ -86,7 +86,7 @@ void testRenderEventTimeFieldSqlWhenNonContinuousDateRange() { params = new EventQueryParams.Builder(params).withStartEndDatesForPeriods().build(); assertEquals( - "((ax.\"executiondate\" >= '2022-04-01' and ax.\"executiondate\" < '2022-07-01')) ", + "((ax.\"occurreddate\" >= '2022-04-01' and ax.\"occurreddate\" < '2022-07-01')) ", timeFieldSqlRenderer.renderPeriodTimeFieldSql(params)); } @@ -103,7 +103,7 @@ void testRenderEventTimeFieldSqlWhenContinuousDateRange() { params = new EventQueryParams.Builder(params).withStartEndDatesForPeriods().build(); assertEquals( - "((ax.\"executiondate\" >= '2022-04-01' and ax.\"executiondate\" < '2022-07-01')) ", + "((ax.\"occurreddate\" >= '2022-04-01' and ax.\"occurreddate\" < '2022-07-01')) ", timeFieldSqlRenderer.renderPeriodTimeFieldSql(params)); } @@ -172,7 +172,7 @@ void testRenderEnrollmentTimeFieldSqlWhenContinuousDateRangeWithTimeFieldNotAllo params = new EventQueryParams.Builder(params).withStartEndDatesForPeriods().build(); assertEquals( - "((ax.\"executiondate\" >= '2022-04-01' and ax.\"executiondate\" < '2022-07-01')) ", + "((ax.\"occurreddate\" >= '2022-04-01' and ax.\"occurreddate\" < '2022-07-01')) ", timeFieldSqlRenderer.renderPeriodTimeFieldSql(params)); } diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManagerTest.java b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManagerTest.java index aaa51c85c446..01eb45e0c725 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManagerTest.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/table/JdbcEventAnalyticsTableManagerTest.java @@ -976,6 +976,6 @@ private String getYearQueryForCurrentYear( } private String getDateLinkedToStatus() { - return "CASE WHEN 'SCHEDULE' = psi.status THEN psi.scheduleddate ELSE psi.executiondate END"; + return "CASE WHEN 'SCHEDULE' = psi.status THEN psi.scheduleddate ELSE psi.occurreddate END"; } } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/PeriodDataProvider.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/PeriodDataProvider.java index cfe7edd007af..51d5c1f9b892 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/PeriodDataProvider.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/period/PeriodDataProvider.java @@ -118,7 +118,7 @@ void addSafetyBuffer(List years, int buffer) { */ private List fetchAvailableYears() { String dueDateOrExecutionDate = - "(case when 'SCHEDULE' = ev.status then ev.scheduleddate else ev.executiondate end)"; + "(case when 'SCHEDULE' = ev.status then ev.scheduleddate else ev.occurreddate end)"; String sql = "( select distinct (extract(year from pe.startdate)) as datayear from period pe )" diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/dataitem/ProgramItemPsEventdate.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/dataitem/ProgramItemPsEventdate.java index 4a161740c10d..6935d33094c4 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/dataitem/ProgramItemPsEventdate.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/dataitem/ProgramItemPsEventdate.java @@ -66,7 +66,7 @@ public final Object getSql(ExpressionParser.ExprContext ctx, CommonExpressionVis .getStatementBuilder() .getProgramIndicatorEventColumnSql( ctx.uid0.getText(), - "executiondate", + "occurreddate", params.getReportingStartDate(), params.getReportingEndDate(), params.getProgramIndicator()); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/function/ProgramMinMaxFunction.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/function/ProgramMinMaxFunction.java index 9cf73b44f67c..39a2e6cf56a2 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/function/ProgramMinMaxFunction.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/function/ProgramMinMaxFunction.java @@ -58,7 +58,7 @@ public Object getSql(ExprContext ctx, CommonExpressionVisitor visitor) { if (ctx.uid1 == null) // arg: PS_EVENTDATE:programStageUid { - columnName = "\"executiondate\""; + columnName = "\"occurreddate\""; } else // arg: #{programStageUid.dataElementUid} { String dataElement = ctx.uid1.getText(); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vEventDate.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vEventDate.java index 5558edf3cc20..ba41a7e62e25 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vEventDate.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vEventDate.java @@ -47,7 +47,7 @@ public Object getSql(CommonExpressionVisitor visitor) { .getStatementBuilder() .getProgramIndicatorEventColumnSql( null, - "executiondate", + "occurreddate", params.getReportingStartDate(), params.getReportingEndDate(), params.getProgramIndicator()); @@ -55,11 +55,11 @@ public Object getSql(CommonExpressionVisitor visitor) { return maybeAppendEventStatusFilterIntoWhere(sqlStatement); } - return "executiondate"; + return "occurreddate"; } private String maybeAppendEventStatusFilterIntoWhere(String sqlStatement) { - int index = sqlStatement.indexOf("order by executiondate"); + int index = sqlStatement.indexOf("order by occurreddate"); if (index == -1) { return sqlStatement; diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vScheduledDate.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vScheduledDate.java index ad32b9ddd6db..1e415c34d3ea 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vScheduledDate.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/variable/vScheduledDate.java @@ -59,7 +59,7 @@ public Object getSql(CommonExpressionVisitor visitor) { } private String maybeAppendEventStatusFilterIntoWhere(String sqlStatement) { - int index = sqlStatement.indexOf("order by executiondate"); + int index = sqlStatement.indexOf("order by occurreddate"); if (index == -1) { return sqlStatement; diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityStore.java index 25c2d934d30b..3afdb4cf336b 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/trackedentity/hibernate/HibernateTrackedEntityStore.java @@ -114,7 +114,7 @@ public class HibernateTrackedEntityStore extends SoftDeleteHibernateObjectStore< private static final String LIMIT = "LIMIT"; - private static final String EV_EXECUTIONDATE = "EV.executiondate"; + private static final String EV_EXECUTIONDATE = "EV.occurreddate"; private static final String EV_DUEDATE = "EV.scheduleddate"; @@ -359,7 +359,7 @@ public int getTrackedEntityCountForGridWithMaxTeiLimit(TrackedEntityQueryParams * the program_constraint, we also have a subquery to deal with any event-related constraints. * These can either be constraints on any static properties, or user assignment. For user * assignment, we also join with the userinfo table. For events, we have an index (status, - * executiondate) which speeds up the lookup significantly order: Order is used both in the + * occurreddate) which speeds up the lookup significantly order: Order is used both in the * subquery and the main query. The sort depends on the params (see more info on the related * method). We order the subquery to make sure we get correct results before we limit. We order * the main query since the aggregation mixes up the order, so to return a consistent order, we diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml index d51291283fb5..630a7f13bb6d 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml +++ b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Enrollment.hbm.xml @@ -59,7 +59,7 @@ - + diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml index 41d76601455a..017e818f50a0 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml +++ b/dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/program/hibernate/Event.hbm.xml @@ -46,7 +46,7 @@ - + diff --git a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorFunctionsTest.java b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorFunctionsTest.java index 92f042f29142..3979cd8116a1 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorFunctionsTest.java +++ b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorFunctionsTest.java @@ -259,7 +259,7 @@ void testCountWithStartEventBoundary() { + "from analytics_event_Program000A " + "where analytics_event_Program000A.pi = ax.pi " + "and \"DataElmentA\" is not null and \"DataElmentA\" is not null " - + "and executiondate < cast( '2021-01-01' as date ) " + + "and occurreddate < cast( '2021-01-01' as date ) " + "and ps = 'ProgrmStagA')")); } @@ -278,7 +278,7 @@ void testCountWithEndEventBoundary() { + "from analytics_event_Program000A " + "where analytics_event_Program000A.pi = ax.pi " + "and \"DataElmentA\" is not null and \"DataElmentA\" is not null " - + "and executiondate >= cast( '2020-01-01' as date ) " + + "and occurreddate >= cast( '2020-01-01' as date ) " + "and ps = 'ProgrmStagA')")); } @@ -297,7 +297,7 @@ void testCountWithStartAndEndEventBoundary() { + "from analytics_event_Program000A " + "where analytics_event_Program000A.pi = ax.pi " + "and \"DataElmentA\" is not null and \"DataElmentA\" is not null " - + "and executiondate < cast( '2021-01-01' as date ) and executiondate >= cast( '2020-01-01' as date ) " + + "and occurreddate < cast( '2021-01-01' as date ) and occurreddate >= cast( '2020-01-01' as date ) " + "and ps = 'ProgrmStagA')")); } @@ -514,10 +514,10 @@ void testYearsBetweenWithProgramStage() { assertThat( sql, is( - "(date_part('year',age(cast((select executiondate from analytics_event_Program000A " - + "where analytics_event_Program000A.pi = ax.pi and executiondate is not null " + "(date_part('year',age(cast((select occurreddate from analytics_event_Program000A " + + "where analytics_event_Program000A.pi = ax.pi and occurreddate is not null " + "and ps = 'ProgrmStagA' " - + "order by executiondate desc limit 1 ) as date), cast(enrollmentdate as date))))")); + + "order by occurreddate desc limit 1 ) as date), cast(enrollmentdate as date))))")); } @Test @@ -530,11 +530,11 @@ void testYearsBetweenWithProgramStageAndBoundaries() { assertThat( sql, is( - "(date_part('year',age(cast((select executiondate from analytics_event_Program000A " - + "where analytics_event_Program000A.pi = ax.pi and executiondate is not null " - + "and executiondate < cast( '2021-01-01' as date ) and executiondate >= cast( '2020-01-01' as date ) " + "(date_part('year',age(cast((select occurreddate from analytics_event_Program000A " + + "where analytics_event_Program000A.pi = ax.pi and occurreddate is not null " + + "and occurreddate < cast( '2021-01-01' as date ) and occurreddate >= cast( '2020-01-01' as date ) " + "and ps = 'ProgrmStagA' " - + "order by executiondate desc limit 1 ) as date), cast(enrollmentdate as date)))) < 1")); + + "order by occurreddate desc limit 1 ) as date), cast(enrollmentdate as date)))) < 1")); } @Test diff --git a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorVariablesTest.java b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorVariablesTest.java index 37fe6b97aab2..23fc75bbc3e0 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorVariablesTest.java +++ b/dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/program/ProgramSqlGeneratorVariablesTest.java @@ -127,7 +127,7 @@ void testCreationDateForEnrollment() { + enrollmentIndicator.getProgram().getUid() + " where analytics_event_" + enrollmentIndicator.getProgram().getUid() - + ".pi = ax.pi and created is not null order by executiondate desc limit 1 )")); + + ".pi = ax.pi and created is not null order by occurreddate desc limit 1 )")); } @Test @@ -189,13 +189,13 @@ void testEventCount() { @Test void testExecutionDate() { String sql = castString(test("V{execution_date}", new DefaultLiteral(), eventIndicator)); - assertThat(sql, is("executiondate")); + assertThat(sql, is("occurreddate")); } @Test void testEventDate() { String sql = castString(test("V{event_date}", new DefaultLiteral(), eventIndicator)); - assertThat(sql, is("executiondate")); + assertThat(sql, is("occurreddate")); } @Test diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java index eebe10bb4086..18deec7a13c3 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/AbstractEventService.java @@ -800,14 +800,13 @@ public void updateEventForEventDate(org.hisp.dhis.dxf2.deprecated.tracker.event. return; } - Date executionDate = new Date(); + Date occurreddate = new Date(); if (event.getEventDate() != null) { - executionDate = DateUtils.parseDate(event.getEventDate()); + occurreddate = DateUtils.parseDate(event.getEventDate()); } - Date eventDate = - executionDate != null ? executionDate : programStageInstance.getScheduledDate(); + Date eventDate = occurreddate != null ? occurreddate : programStageInstance.getScheduledDate(); validateAttributeOptionComboDate(programStageInstance.getAttributeOptionCombo(), eventDate); @@ -827,7 +826,7 @@ public void updateEventForEventDate(org.hisp.dhis.dxf2.deprecated.tracker.event. } programStageInstance.setOrganisationUnit(organisationUnit); - programStageInstance.setOccurredDate(executionDate); + programStageInstance.setOccurredDate(occurreddate); eventService.updateEvent(programStageInstance); } diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java index fe2d09c35b67..92547a225d9c 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/event/JdbcEventStore.java @@ -1027,7 +1027,7 @@ private String getEventSelectQuery( .append(" psi.uid as psi_uid, ") .append("ou.uid as ou_uid, p.uid as p_uid, ps.uid as ps_uid, ") .append( - "psi.eventid as psi_id, psi.status as psi_status, psi.executiondate as psi_executiondate, ") + "psi.eventid as psi_id, psi.status as psi_status, psi.occurreddate as psi_executiondate, ") .append( "psi.eventdatavalues as psi_eventdatavalues, psi.scheduleddate as psi_duedate, psi.completedby as psi_completedby, psi.storedby as psi_storedby, ") .append( @@ -1240,9 +1240,9 @@ private StringBuilder getFromWhereClause( fromBuilder .append(hlp.whereAnd()) - .append(" (psi.executiondate >= ") + .append(" (psi.occurreddate >= ") .append(":startDate") - .append(" or (psi.executiondate is null and psi.scheduleddate >= ") + .append(" or (psi.occurreddate is null and psi.scheduleddate >= ") .append(":startDate") .append(" )) "); } @@ -1252,9 +1252,9 @@ private StringBuilder getFromWhereClause( fromBuilder .append(hlp.whereAnd()) - .append(" (psi.executiondate < ") + .append(" (psi.occurreddate < ") .append(":endDate") - .append(" or (psi.executiondate is null and psi.scheduleddate < ") + .append(" or (psi.occurreddate is null and psi.scheduleddate < ") .append(":endDate") .append(" )) "); } @@ -1529,9 +1529,9 @@ private String getFromWhereClause( sqlBuilder .append(hlp.whereAnd()) - .append(" (psi.executiondate >= ") + .append(" (psi.occurreddate >= ") .append(":startDate") - .append(" or (psi.executiondate is null and psi.scheduleddate >= ") + .append(" or (psi.occurreddate is null and psi.scheduleddate >= ") .append(":startDate") .append(" )) "); } @@ -1541,9 +1541,9 @@ private String getFromWhereClause( sqlBuilder .append(hlp.whereAnd()) - .append(" (psi.executiondate < ") + .append(" (psi.occurreddate < ") .append(":endDate ") - .append(" or (psi.executiondate is null and psi.scheduleddate < ") + .append(" or (psi.occurreddate is null and psi.scheduleddate < ") .append(":endDate") .append(" )) "); } @@ -1631,7 +1631,7 @@ private String eventStatusSql( .append(hlp.whereAnd()) .append(PSI_STATUS_EQ) .append(":" + PSI_STATUS) - .append(" and psi.executiondate is not null "); + .append(" and psi.occurreddate is not null "); } else if (params.getEventStatus() == EventStatus.OVERDUE) { mapSqlParameterSource.addValue(PSI_STATUS, EventStatus.SCHEDULE.name()); diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java index 0a3590ea4eeb..5862cf08df83 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/context/ProgramStageInstanceSupplier.java @@ -91,7 +91,7 @@ public Map get( final String sql = "select psi.enrollmentid, psi.programstageid, psi.eventid, " - + "psi.uid, psi.status, psi.deleted, psi.eventdatavalues, psi.scheduleddate, psi.executiondate, " + + "psi.uid, psi.status, psi.deleted, psi.eventdatavalues, psi.scheduleddate, psi.occurreddate, " + "psi.completeddate, psi.attributeoptioncomboid, psi.geometry, " + "ou.organisationunitid, ou.uid, ou.code, ou.name, psi.attributeoptioncomboid, c.uid as coc_uid " + "from event psi join organisationunit ou on psi.organisationunitid = ou.organisationunitid " @@ -117,7 +117,7 @@ public Map get( psi.setProgramStage(getProgramStage(importOptions, rs.getLong("programstageid"))); psi.setOrganisationUnit(getOu(rs)); psi.setScheduledDate(rs.getTimestamp("scheduleddate")); - psi.setOccurredDate(rs.getTimestamp("executiondate")); + psi.setOccurredDate(rs.getTimestamp("occurreddate")); psi.setCompletedDate(rs.getTimestamp("completeddate")); psi.setAttributeOptionCombo(getCatOptionCombo(rs)); try { diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/AttributeOptionComboDateCheck.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/AttributeOptionComboDateCheck.java index 2307fc2dedb8..dec19c27ed0b 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/AttributeOptionComboDateCheck.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/importer/shared/validation/AttributeOptionComboDateCheck.java @@ -51,10 +51,10 @@ public class AttributeOptionComboDateCheck implements Checker { public ImportSummary check(ImmutableEvent event, WorkContext ctx) { CategoryOptionCombo attributeOptionCombo = ctx.getCategoryOptionComboMap().get(event.getUid()); - Date executionDate = null; + Date occurreddate = null; if (event.getEventDate() != null) { - executionDate = DateUtils.parseDate(event.getEventDate()); + occurreddate = DateUtils.parseDate(event.getEventDate()); } Date dueDate = new Date(); @@ -63,7 +63,7 @@ public ImportSummary check(ImmutableEvent event, WorkContext ctx) { dueDate = DateUtils.parseDate(event.getDueDate()); } - Date eventDate = executionDate != null ? executionDate : dueDate; + Date eventDate = occurreddate != null ? occurreddate : dueDate; if (eventDate == null) { return error("Event date can not be empty", event.getEvent()); diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/trackedentity/store/query/EventQuery.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/trackedentity/store/query/EventQuery.java index 69050674cd78..29e0ec44d82b 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/trackedentity/store/query/EventQuery.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/deprecated/tracker/trackedentity/store/query/EventQuery.java @@ -49,7 +49,7 @@ public enum COLUMNS { ID(new TableColumn("psi", "eventid")), UID(new TableColumn("psi", "uid")), STATUS(new TableColumn("psi", "status")), - EXECUTION_DATE(new TableColumn("psi", "executiondate")), + EXECUTION_DATE(new TableColumn("psi", "occurreddate")), DUE_DATE(new TableColumn("psi", "scheduleddate")), STOREDBY(new TableColumn("psi", "storedby")), COMPLETEDBY(new TableColumn("psi", "completedby")), diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQuery.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQuery.java index c5b14535eeda..97e78957528f 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQuery.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/EventQuery.java @@ -39,7 +39,7 @@ public enum COLUMNS { ID(new TableColumn("ev", "eventid")), UID(new TableColumn("ev", "uid")), STATUS(new TableColumn("ev", "status")), - EXECUTION_DATE(new TableColumn("ev", "executiondate")), + OCCURRED_DATE(new TableColumn("ev", "occurreddate")), SCHEDULED_DATE(new TableColumn("ev", "scheduleddate")), STOREDBY(new TableColumn("ev", "storedby")), COMPLETEDBY(new TableColumn("ev", "completedby")), diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java index 1a6c81fdc885..1c9383ad1e61 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/event/JdbcEventStore.java @@ -161,7 +161,7 @@ class JdbcEventStore implements EventStore { private static final String COLUMN_ENROLLMENT_DATE = "en_enrollmentdate"; private static final String COLUMN_ORG_UNIT_UID = "orgunit_uid"; private static final String COLUMN_TRACKEDENTITY_UID = "te_uid"; - private static final String COLUMN_EVENT_EXECUTION_DATE = "ev_executiondate"; + private static final String COLUMN_EVENT_OCCURRED_DATE = "ev_occurreddate"; private static final String COLUMN_ENROLLMENT_FOLLOWUP = "en_followup"; private static final String COLUMN_EVENT_STATUS = "ev_status"; private static final String COLUMN_EVENT_SCHEDULED_DATE = "ev_scheduleddate"; @@ -198,7 +198,7 @@ class JdbcEventStore implements EventStore { entry("enrollment.enrollmentDate", COLUMN_ENROLLMENT_DATE), entry("organisationUnit.uid", COLUMN_ORG_UNIT_UID), entry("enrollment.trackedEntity.uid", COLUMN_TRACKEDENTITY_UID), - entry("occurredDate", COLUMN_EVENT_EXECUTION_DATE), + entry("occurredDate", COLUMN_EVENT_OCCURRED_DATE), entry("enrollment.followUp", COLUMN_ENROLLMENT_FOLLOWUP), entry("status", COLUMN_EVENT_STATUS), entry("scheduledDate", COLUMN_EVENT_SCHEDULED_DATE), @@ -327,7 +327,7 @@ private List fetchEvents(EventQueryParams queryParams, PageParams pagePar event.setStoredBy(resultSet.getString(COLUMN_EVENT_STORED_BY)); event.setScheduledDate(resultSet.getTimestamp(COLUMN_EVENT_SCHEDULED_DATE)); - event.setOccurredDate(resultSet.getTimestamp(COLUMN_EVENT_EXECUTION_DATE)); + event.setOccurredDate(resultSet.getTimestamp(COLUMN_EVENT_OCCURRED_DATE)); event.setCreated(resultSet.getTimestamp(COLUMN_EVENT_CREATED)); event.setCreatedByUserInfo( EventUtils.jsonToUserInfo( @@ -733,8 +733,8 @@ private String getEventSelectQuery( .append(COLUMN_EVENT_ID) .append(", ev.status as ") .append(COLUMN_EVENT_STATUS) - .append(", ev.executiondate as ") - .append(COLUMN_EVENT_EXECUTION_DATE) + .append(", ev.occurreddate as ") + .append(COLUMN_EVENT_OCCURRED_DATE) .append(", ") .append("ev.eventdatavalues as ev_eventdatavalues, ev.scheduleddate as ") .append(COLUMN_EVENT_SCHEDULED_DATE) @@ -985,9 +985,9 @@ private StringBuilder getFromWhereClause( fromBuilder .append(hlp.whereAnd()) - .append(" (ev.executiondate >= ") + .append(" (ev.occurreddate >= ") .append(":startDate") - .append(" or (ev.executiondate is null and ev.scheduleddate >= ") + .append(" or (ev.occurreddate is null and ev.scheduleddate >= ") .append(":startDate") .append(" )) "); } @@ -998,9 +998,9 @@ private StringBuilder getFromWhereClause( fromBuilder .append(hlp.whereAnd()) - .append(" (ev.executiondate < ") + .append(" (ev.occurreddate < ") .append(":endDate") - .append(" or (ev.executiondate is null and ev.scheduleddate < ") + .append(" or (ev.occurreddate is null and ev.scheduleddate < ") .append(":endDate") .append(" )) "); } @@ -1372,7 +1372,7 @@ private String eventStatusSql( .append(hlp.whereAnd()) .append(EVENT_STATUS_EQ) .append(":" + COLUMN_EVENT_STATUS) - .append(" and ev.executiondate is not null "); + .append(" and ev.occurreddate is not null "); } else if (params.getEventStatus() == EventStatus.OVERDUE) { mapSqlParameterSource.addValue(COLUMN_EVENT_STATUS, EventStatus.SCHEDULE.name()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java index 3674f00c448c..91c05f763403 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java @@ -96,7 +96,7 @@ class HibernateTrackedEntityStore extends SoftDeleteHibernateObjectStoreNow, we also need to support SCHEDULE status for events. For this reason this method * compares the status. If the column is "scheduleddate", it means we only want SCHEDULE status, * so we return "scheduleddate". In all other cases we assume any other status different from * SCHEDULE (which makes it backward compatible). In this case the logic will remain based on - * "executiondate". + * "occurreddate". * * @param column * @return the backwards compatible column diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventDataQueryServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventDataQueryServiceTest.java index 87be572dfa77..a0da7ddb15b4 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventDataQueryServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/analytics/event/data/EventDataQueryServiceTest.java @@ -275,7 +275,7 @@ void testGetFromUrlWithEventDateSorting() { assertEquals(1, params.getFilterPeriods().size()); assertEquals(deA, params.getValue()); assertEquals(1, params.getDesc().size()); - assertEquals("executiondate", params.getDesc().get(0).getItem().getName()); + assertEquals("occurreddate", params.getDesc().get(0).getItem().getName()); assertEquals(AnalyticsAggregationType.AVERAGE, params.getAggregationType()); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceD2FunctionTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceD2FunctionTest.java index 1931f7add77f..bf9cf1493fb7 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceD2FunctionTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceD2FunctionTest.java @@ -171,8 +171,8 @@ void testD2Condition() { getSql( "d2:condition( 'd2:hasValue(#{ProgrmStagA.DataElmentA})', 1+4, d2:zpvc(#{Program000B.DataElmentB}) )")); assertEquals( - "case when (((select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) is not null)) " - + "then 1 + 4 else nullif(cast((case when (select \"DataElmentB\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentB\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'Program000B' order by executiondate desc limit 1 ) >= 0 then 1 else 0 end) as double precision),0) end", + "case when (((select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) is not null)) " + + "then 1 + 4 else nullif(cast((case when (select \"DataElmentB\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentB\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'Program000B' order by occurreddate desc limit 1 ) >= 0 then 1 else 0 end) as double precision),0) end", getSqlEnrollment( "d2:condition( \"d2:hasValue(#{ProgrmStagA.DataElmentA})\", 1+4, d2:zpvc(#{Program000B.DataElmentB}) )")); } @@ -180,10 +180,10 @@ void testD2Condition() { @Test void testD2Count() { assertEquals( - "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSql("d2:count(#{ProgrmStagA.DataElmentA})")); assertEquals( - "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSqlEnrollment("d2:count(#{ProgrmStagA.DataElmentA})")); } @@ -192,13 +192,13 @@ void testD2CountIfCondition() { assertEquals( "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi " + "and \"DataElmentA\" is not null and \"DataElmentA\" >= coalesce(case when ax.\"ps\" = 'Program000B' then \"DataElmentB\" else null end::numeric,0) " - + "and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + + "and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSql( "d2:countIfCondition( #{ProgrmStagA.DataElmentA}, ' >= #{Program000B.DataElmentB}')")); assertEquals( "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" >= coalesce(" - + "(select \"DataElmentB\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentB\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'Program000B' order by executiondate desc limit 1 )::numeric,0) " - + "and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + + "(select \"DataElmentB\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentB\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'Program000B' order by occurreddate desc limit 1 )::numeric,0) " + + "and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSqlEnrollment( "d2:countIfCondition( #{ProgrmStagA.DataElmentA}, \" >= #{Program000B.DataElmentB}\")")); } @@ -206,21 +206,21 @@ void testD2CountIfCondition() { @Test void testD2CountIfValue() { assertEquals( - "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" = 10 and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" = 10 and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSql("d2:countIfValue(#{ProgrmStagA.DataElmentA}, 10)")); assertEquals( - "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" = 10 and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + "(select count(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and \"DataElmentA\" = 10 and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSqlEnrollment("d2:countIfValue(#{ProgrmStagA.DataElmentA}, 10)")); } @Test void testD2DaysBetween() { assertEquals( - "(cast(executiondate as date) - cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date))", + "(cast(occurreddate as date) - cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date))", getSql("d2:daysBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( - "(cast((select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date) " - + "- cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date))", + "(cast((select occurreddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as date) " + + "- cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as date))", getSqlEnrollment("d2:daysBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); } @@ -230,7 +230,7 @@ void testD2HasValue() { "(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end is not null)", getSql("d2:hasValue(#{ProgrmStagA.DataElmentA})")); assertEquals( - "((select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) is not null)", + "((select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) is not null)", getSqlEnrollment("d2:hasValue(#{ProgrmStagA.DataElmentA})")); } @@ -238,22 +238,22 @@ void testD2HasValue() { void testD2MaxValue() { assertEquals("\"DataElmentA\"", getSql("d2:maxValue(#{ProgrmStagA.DataElmentA})")); assertEquals( - "(select max(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + "(select max(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSqlEnrollment("d2:maxValue(#{ProgrmStagA.DataElmentA})")); - assertEquals("\"executiondate\"", getSql("d2:maxValue(PS_EVENTDATE:ProgrmStagA)")); + assertEquals("\"occurreddate\"", getSql("d2:maxValue(PS_EVENTDATE:ProgrmStagA)")); assertEquals( - "(select max(\"executiondate\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + "(select max(\"occurreddate\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSqlEnrollment("d2:maxValue(PS_EVENTDATE:ProgrmStagA)")); } @Test void testD2MinutesBetween() { assertEquals( - "(extract(epoch from (cast(executiondate as timestamp) - cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as timestamp))) / 60)", + "(extract(epoch from (cast(occurreddate as timestamp) - cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as timestamp))) / 60)", getSql("d2:minutesBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( - "(extract(epoch from (cast((select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as timestamp) " - + "- cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as timestamp))) / 60)", + "(extract(epoch from (cast((select occurreddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as timestamp) " + + "- cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as timestamp))) / 60)", getSqlEnrollment( "d2:minutesBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); } @@ -262,39 +262,39 @@ void testD2MinutesBetween() { void testD2MinValue() { assertEquals("\"DataElmentA\"", getSql("d2:minValue(#{ProgrmStagA.DataElmentA})")); assertEquals( - "(select min(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + "(select min(\"DataElmentA\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSqlEnrollment("d2:minValue(#{ProgrmStagA.DataElmentA})")); - assertEquals("\"executiondate\"", getSql("d2:minValue(PS_EVENTDATE:ProgrmStagA)")); + assertEquals("\"occurreddate\"", getSql("d2:minValue(PS_EVENTDATE:ProgrmStagA)")); assertEquals( - "(select min(\"executiondate\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", + "(select min(\"occurreddate\") from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA')", getSqlEnrollment("d2:minValue(PS_EVENTDATE:ProgrmStagA)")); } @Test void testD2MonthsBetween() { assertEquals( - "((date_part('year',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date)))) * 12 " - + "+ date_part('month',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date))))", + "((date_part('year',age(cast(occurreddate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date)))) * 12 " + + "+ date_part('month',age(cast(occurreddate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentD\" else null end as date))))", getSql("d2:monthsBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( - "((date_part('year',age(cast((select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date), " - + "cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date)))) " - + "* 12 + date_part('month',age(cast((select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date), " - + "cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date))))", + "((date_part('year',age(cast((select occurreddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as date), " + + "cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as date)))) " + + "* 12 + date_part('month',age(cast((select occurreddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as date), " + + "cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as date))))", getSqlEnrollment("d2:monthsBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); } @Test void testD2Oizp() { assertEquals( - "((date_part('year',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date)))) * 12 " - + "+ date_part('month',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date))))", + "((date_part('year',age(cast(occurreddate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date)))) * 12 " + + "+ date_part('month',age(cast(occurreddate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date))))", getSql("d2:monthsBetween(#{ProgrmStagA.DataElmentA}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( "coalesce(case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end >= 0 then 1 else 0 end, 0)", getSql("d2:oizp(#{ProgrmStagA.DataElmentA})")); assertEquals( - "coalesce(case when (select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) >= 0 then 1 else 0 end, 0)", + "coalesce(case when (select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) >= 0 then 1 else 0 end, 0)", getSqlEnrollment("d2:oizp(#{ProgrmStagA.DataElmentA})")); } @@ -317,29 +317,29 @@ void testD2RelationshipCount() { @Test void testD2WeeksBetween() { assertEquals( - "((cast(executiondate as date) - cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date))/7)", + "((cast(occurreddate as date) - cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date))/7)", getSql("d2:weeksBetween(#{ProgrmStagA.DataElmentA}, PS_EVENTDATE:ProgrmStagA)")); assertEquals( - "((cast((select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date) " - + "- cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date))/7)", + "((cast((select occurreddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as date) " + + "- cast((select \"DataElmentD\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as date))/7)", getSqlEnrollment("d2:weeksBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)")); } @Test void testD2YearsBetween() { assertEquals( - "(date_part('year',age(cast(executiondate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date))))", + "(date_part('year',age(cast(occurreddate as date), cast(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end as date))))", getSql("d2:yearsBetween(#{ProgrmStagA.DataElmentA}, PS_EVENTDATE:ProgrmStagA)")); var enrol = getSqlEnrollment("d2:yearsBetween(#{ProgrmStagA.DataElmentD}, PS_EVENTDATE:ProgrmStagA)"); assertEquals( - "(date_part('year',age(cast((select executiondate from analytics_event_Program000A " - + "where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < " - + "cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' " - + "order by executiondate desc limit 1 ) as date), " + "(date_part('year',age(cast((select occurreddate from analytics_event_Program000A " + + "where analytics_event_Program000A.pi = ax.pi and occurreddate is not null and occurreddate < " + + "cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' " + + "order by occurreddate desc limit 1 ) as date), " + "cast((select \"DataElmentD\" from analytics_event_Program000A " - + "where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and executiondate < " - + "cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) as date))))", + + "where analytics_event_Program000A.pi = ax.pi and \"DataElmentD\" is not null and occurreddate < " + + "cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) as date))))", enrol); } @@ -349,7 +349,7 @@ void testD2Zing() { "greatest(0,coalesce(case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentA\" else null end::numeric,0) + 5)", getSql("d2:zing(#{ProgrmStagA.DataElmentA} + 5)")); assertEquals( - "greatest(0,coalesce((select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 )::numeric,0) + 5)", + "greatest(0,coalesce((select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 )::numeric,0) + 5)", getSqlEnrollment("d2:zing(#{ProgrmStagA.DataElmentA} + 5)")); } @@ -360,8 +360,8 @@ void testD2Zpvc() { + "+ case when case when ax.\"ps\" = 'ProgrmStagA' then \"DataElmentB\" else null end >= 0 then 1 else 0 end) as double precision),0)", getSql("d2:zpvc(#{ProgrmStagA.DataElmentA},#{ProgrmStagA.DataElmentB})")); assertEquals( - "nullif(cast((case when (select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 ) >= 0 then 1 else 0 end " - + "+ case when (select \"DataElmentB\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentB\" is not null and executiondate < cast( '2020-01-10' as date ) and executiondate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagB' order by executiondate desc limit 1 ) >= 0 then 1 else 0 end) as double precision),0)", + "nullif(cast((case when (select \"DataElmentA\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentA\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 ) >= 0 then 1 else 0 end " + + "+ case when (select \"DataElmentB\" from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and \"DataElmentB\" is not null and occurreddate < cast( '2020-01-10' as date ) and occurreddate >= cast( '2020-01-09' as date ) and ps = 'ProgrmStagB' order by occurreddate desc limit 1 ) >= 0 then 1 else 0 end) as double precision),0)", getSqlEnrollment("d2:zpvc(#{ProgrmStagA.DataElmentA},#{ProgrmStagB.DataElmentB})")); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java index b29b162f61e9..65e8701f8383 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceTest.java @@ -606,12 +606,12 @@ void testNestedSubqueryWithTableAlias() { Date dateTo = getDate(2019, 12, 31); // Generated subquery, since indicatorF is type Enrollment String expected = - "coalesce((select \"DataElmentA\" from analytics_event_Program000B where analytics_event_Program000B.pi = axx1.pi and \"DataElmentA\" is not null and executiondate < cast( '" + "coalesce((select \"DataElmentA\" from analytics_event_Program000B where analytics_event_Program000B.pi = axx1.pi and \"DataElmentA\" is not null and occurreddate < cast( '" + "2020-01-11" - + "' as date ) and ps = 'ProgrmStagA' order by executiondate desc limit 1 )::numeric,0) - " - + "coalesce((select \"DataElmentC\" from analytics_event_Program000B where analytics_event_Program000B.pi = axx1.pi and \"DataElmentC\" is not null and executiondate < cast( '" + + "' as date ) and ps = 'ProgrmStagA' order by occurreddate desc limit 1 )::numeric,0) - " + + "coalesce((select \"DataElmentC\" from analytics_event_Program000B where analytics_event_Program000B.pi = axx1.pi and \"DataElmentC\" is not null and occurreddate < cast( '" + "2020-01-11" - + "' as date ) and ps = 'ProgrmStagB' order by executiondate desc limit 1 )::numeric,0)"; + + "' as date ) and ps = 'ProgrmStagB' order by occurreddate desc limit 1 )::numeric,0)"; String expression = "#{ProgrmStagA.DataElmentA} - #{ProgrmStagB.DataElmentC}"; assertEquals( expected, diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceVariableTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceVariableTest.java index e1b4d54040bf..e825896c6640 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceVariableTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/program/ProgramIndicatorServiceVariableTest.java @@ -125,7 +125,7 @@ void testAnalyticsPeriodStart() { void testCreationDate() { assertEquals("created", getSql("V{creation_date}")); assertEquals( - "(select created from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and created is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) order by executiondate desc limit 1 )", + "(select created from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and created is not null and occurreddate < cast( '2020-02-01' as date ) and occurreddate >= cast( '2020-01-01' as date ) order by occurreddate desc limit 1 )", getSqlEnrollment("V{creation_date}")); } @@ -140,7 +140,7 @@ void testCurrentDate() { void testDueDate() { assertEquals("scheduleddate", getSql("V{due_date}")); assertEquals( - "(select scheduleddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and scheduleddate is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) order by executiondate desc limit 1 )", + "(select scheduleddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and scheduleddate is not null and occurreddate < cast( '2020-02-01' as date ) and occurreddate >= cast( '2020-01-01' as date ) order by occurreddate desc limit 1 )", getSqlEnrollment("V{due_date}")); } @@ -166,7 +166,7 @@ void testEnrollmentStatus() { void testEventStatus() { assertEquals("psistatus", getSql("V{event_status}")); assertEquals( - "(select psistatus from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and psistatus is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) order by executiondate desc limit 1 )", + "(select psistatus from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and psistatus is not null and occurreddate < cast( '2020-02-01' as date ) and occurreddate >= cast( '2020-01-01' as date ) order by occurreddate desc limit 1 )", getSqlEnrollment("V{event_status}")); } @@ -195,17 +195,17 @@ void testScheduledEventCount() { @Test void testExecutionDate() { - assertEquals("executiondate", getSql("V{execution_date}")); + assertEquals("occurreddate", getSql("V{execution_date}")); assertEquals( - "(select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) and psistatus IN ('COMPLETED', 'ACTIVE') order by executiondate desc limit 1 )", + "(select occurreddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate is not null and occurreddate < cast( '2020-02-01' as date ) and occurreddate >= cast( '2020-01-01' as date ) and psistatus IN ('COMPLETED', 'ACTIVE') order by occurreddate desc limit 1 )", getSqlEnrollment("V{execution_date}")); } @Test void testEventDate() { - assertEquals("executiondate", getSql("V{event_date}")); + assertEquals("occurreddate", getSql("V{event_date}")); assertEquals( - "(select executiondate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and executiondate is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) and psistatus IN ('COMPLETED', 'ACTIVE') order by executiondate desc limit 1 )", + "(select occurreddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and occurreddate is not null and occurreddate < cast( '2020-02-01' as date ) and occurreddate >= cast( '2020-01-01' as date ) and psistatus IN ('COMPLETED', 'ACTIVE') order by occurreddate desc limit 1 )", getSqlEnrollment("V{event_date}")); } @@ -213,7 +213,7 @@ void testEventDate() { void testScheduledDate() { assertEquals("scheduleddate", getSql("V{scheduled_date}")); assertEquals( - "(select scheduleddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and scheduleddate is not null and executiondate < cast( '2020-02-01' as date ) and executiondate >= cast( '2020-01-01' as date ) and psistatus = 'SCHEDULE' order by executiondate desc limit 1 )", + "(select scheduleddate from analytics_event_Program000A where analytics_event_Program000A.pi = ax.pi and scheduleddate is not null and occurreddate < cast( '2020-02-01' as date ) and occurreddate >= cast( '2020-01-01' as date ) and psistatus = 'SCHEDULE' order by occurreddate desc limit 1 )", getSqlEnrollment("V{scheduled_date}")); } diff --git a/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json b/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json index 4aebaaca982d..7b60887b277b 100644 --- a/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json +++ b/dhis-2/dhis-test-integration/src/test/resources/tracker/event_and_enrollment.json @@ -585,7 +585,6 @@ }, "relationships": [], "occurredAt": "2020-01-28T00:00:00.000", - "executionDate": "2019-01-28T00:00:00.000", "scheduledAt": "2019-01-28T12:10:38.100", "storedBy": "admin", "followUp": true, From e2e07557aefe2a54134d1b6f328ac51ae046f886 Mon Sep 17 00:00:00 2001 From: marc Date: Tue, 14 Nov 2023 10:52:09 +0100 Subject: [PATCH 59/63] fix: Use org unit path instead of multiple org unit ids [TECH-1586] (#15653) * fix: Use org unit path instead of multiple org unit ids [TECH-1586] * fix: Split org unit sql query creation by org unit mode [TECH-1586] * fix: Use path instead of org unit uid to filter enrollments [TECH-1586] * fix: Resolve test conflict [TECH-1586] --- .../enrollment/DefaultEnrollmentService.java | 8 -- .../enrollment/HibernateEnrollmentStore.java | 61 +++++++--- .../HibernateTrackedEntityStore.java | 66 ++++++++--- .../TrackedEntityQueryParams.java | 10 -- .../enrollment/EnrollmentServiceTest.java | 105 +++++++++++++++++- .../TrackedEntityServiceTest.java | 92 ++++++++++++++- 6 files changed, 288 insertions(+), 54 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java index 3992d9c27579..ca94d7be5498 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/DefaultEnrollmentService.java @@ -208,14 +208,6 @@ public List getEnrollments(EnrollmentOperationParams params) } else if (user != null && queryParams.isOrganisationUnitMode(CAPTURE)) { queryParams.setOrganisationUnits(user.getOrganisationUnits()); queryParams.setOrganisationUnitMode(DESCENDANTS); - } else if (queryParams.isOrganisationUnitMode(CHILDREN)) { - Set organisationUnits = new HashSet<>(queryParams.getOrganisationUnits()); - - for (OrganisationUnit organisationUnit : queryParams.getOrganisationUnits()) { - organisationUnits.addAll(organisationUnit.getChildren()); - } - - queryParams.setOrganisationUnits(organisationUnits); } return getEnrollments( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/HibernateEnrollmentStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/HibernateEnrollmentStore.java index 660d10da4951..2e5f44801dcb 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/HibernateEnrollmentStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/enrollment/HibernateEnrollmentStore.java @@ -187,23 +187,12 @@ private QueryWithOrderBy buildEnrollmentHql(EnrollmentQueryParams params) { if (params.hasOrganisationUnits()) { if (params.isOrganisationUnitMode(OrganisationUnitSelectionMode.DESCENDANTS)) { - String ouClause = "("; - SqlHelper orHlp = new SqlHelper(true); + hql += hlp.whereAnd() + getDescendantsQuery(params.getOrganisationUnits()); + } else if (params.isOrganisationUnitMode(OrganisationUnitSelectionMode.CHILDREN)) { + hql += hlp.whereAnd() + getChildrenQuery(hlp, params.getOrganisationUnits()); - for (OrganisationUnit organisationUnit : params.getOrganisationUnits()) { - ouClause += - orHlp.or() + "en.organisationUnit.path LIKE '" + organisationUnit.getPath() + "%'"; - } - - ouClause += ")"; - - hql += hlp.whereAnd() + ouClause; } else { - hql += - hlp.whereAnd() - + "en.organisationUnit.uid in (" - + getQuotedCommaDelimitedString(getUids(params.getOrganisationUnits())) - + ")"; + hql += hlp.whereAnd() + getSelectedQuery(params.getOrganisationUnits()); } } @@ -242,6 +231,48 @@ private QueryWithOrderBy buildEnrollmentHql(EnrollmentQueryParams params) { return QueryWithOrderBy.builder().query(hql).orderBy(orderBy(params.getOrder())).build(); } + private String getDescendantsQuery(Set organisationUnits) { + StringBuilder ouClause = new StringBuilder(); + ouClause.append("("); + + SqlHelper orHlp = new SqlHelper(true); + + for (OrganisationUnit organisationUnit : organisationUnits) { + ouClause + .append(orHlp.or()) + .append("en.organisationUnit.path LIKE '") + .append(organisationUnit.getPath()) + .append("%'"); + } + + ouClause.append(")"); + + return ouClause.toString(); + } + + private String getChildrenQuery(SqlHelper hlp, Set organisationUnits) { + StringBuilder orgUnits = new StringBuilder(); + for (OrganisationUnit organisationUnit : organisationUnits) { + orgUnits + .append(hlp.or()) + .append("en.organisationUnit.path LIKE '") + .append(organisationUnit.getPath()) + .append("%'") + .append(" AND (en.organisationUnit.hierarchyLevel = ") + .append(organisationUnit.getHierarchyLevel()) + .append(" OR en.organisationUnit.hierarchyLevel = ") + .append((organisationUnit.getHierarchyLevel() + 1)) + .append(")"); + } + return orgUnits.toString(); + } + + private String getSelectedQuery(Set organisationUnits) { + return "en.organisationUnit.uid in (" + + getQuotedCommaDelimitedString(getUids(organisationUnits)) + + ")"; + } + private static String orderBy(List orders) { if (orders.isEmpty()) { return " order by " + DEFAULT_ORDER; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java index 91c05f763403..ea03498050c1 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/HibernateTrackedEntityStore.java @@ -645,29 +645,69 @@ private String getFromSubQueryJoinOrgUnitConditions(TrackedEntityQueryParams par } if (params.isOrganisationUnitMode(OrganisationUnitSelectionMode.DESCENDANTS)) { - SqlHelper orHlp = new SqlHelper(true); + orgUnits.append(getDescendantsQuery(params)); + } else if (params.isOrganisationUnitMode(OrganisationUnitSelectionMode.CHILDREN)) { + orgUnits.append(getChildrenQuery(params)); + } else if (params.isOrganisationUnitMode(OrganisationUnitSelectionMode.SELECTED)) { + orgUnits.append(getSelectedQuery(params)); + } - orgUnits.append("AND ("); + return orgUnits.toString(); + } - for (OrganisationUnit organisationUnit : params.getOrgUnits()) { + private String getDescendantsQuery(TrackedEntityQueryParams params) { + StringBuilder orgUnits = new StringBuilder(); + SqlHelper orHlp = new SqlHelper(true); - OrganisationUnit ou = organisationUnitStore.getByUid(organisationUnit.getUid()); - if (ou != null) { - orgUnits.append(orHlp.or()).append("OU.path LIKE '").append(ou.getPath()).append("%'"); - } + orgUnits.append("AND ("); + + for (OrganisationUnit organisationUnit : params.getOrgUnits()) { + + OrganisationUnit ou = organisationUnitStore.getByUid(organisationUnit.getUid()); + if (ou != null) { + orgUnits.append(orHlp.or()).append("OU.path LIKE '").append(ou.getPath()).append("%'"); } + } - orgUnits.append(") "); - } else if (!params.isOrganisationUnitMode(OrganisationUnitSelectionMode.ALL)) { - orgUnits - .append("AND OU.organisationunitid IN (") - .append(getCommaDelimitedString(getIdentifiers(params.getOrgUnits()))) - .append(") "); + orgUnits.append(") "); + + return orgUnits.toString(); + } + + private String getChildrenQuery(TrackedEntityQueryParams params) { + StringBuilder orgUnits = new StringBuilder(); + SqlHelper orHlp = new SqlHelper(true); + + orgUnits.append("AND ("); + + for (OrganisationUnit organisationUnit : params.getOrgUnits()) { + + OrganisationUnit ou = organisationUnitStore.getByUid(organisationUnit.getUid()); + if (ou != null) { + orgUnits + .append(orHlp.or()) + .append(" OU.path LIKE '") + .append(ou.getPath()) + .append("%'") + .append(" AND (ou.hierarchylevel = ") + .append(ou.getHierarchyLevel()) + .append(" OR ou.hierarchylevel = ") + .append((ou.getHierarchyLevel() + 1)) + .append(")"); + } } + orgUnits.append(") "); + return orgUnits.toString(); } + private String getSelectedQuery(TrackedEntityQueryParams params) { + return "AND OU.organisationunitid IN (" + + getCommaDelimitedString(getIdentifiers(params.getOrgUnits())) + + ") "; + } + /** * Generates an INNER JOIN for enrollments. If the param we need to order by is enrolledAt, we * need to join the enrollment table to be able to select and order by this value diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityQueryParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityQueryParams.java index f65fbdb85250..286a3ff4c364 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityQueryParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityQueryParams.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.export.trackedentity; import static java.lang.Boolean.TRUE; -import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CHILDREN; import com.google.common.collect.Lists; import java.util.ArrayList; @@ -170,15 +169,6 @@ public void handleOrganisationUnits() { } else if (user != null && isOrganisationUnitMode(OrganisationUnitSelectionMode.CAPTURE)) { setOrgUnits(user.getOrganisationUnits()); setOrgUnitMode(OrganisationUnitSelectionMode.DESCENDANTS); - } else if (isOrganisationUnitMode(CHILDREN)) { - Set organisationUnits = new HashSet<>(getOrgUnits()); - - for (OrganisationUnit organisationUnit : getOrgUnits()) { - organisationUnits.addAll(organisationUnit.getChildren()); - } - - setOrgUnits(organisationUnits); - setOrgUnitMode(OrganisationUnitSelectionMode.SELECTED); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java index 16a5384db249..743760e51651 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/enrollment/EnrollmentServiceTest.java @@ -31,6 +31,8 @@ import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ACCESSIBLE; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CAPTURE; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CHILDREN; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.DESCENDANTS; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.SELECTED; import static org.hisp.dhis.tracker.TrackerTestUtils.oneHourAfter; import static org.hisp.dhis.tracker.TrackerTestUtils.oneHourBefore; @@ -102,6 +104,8 @@ class EnrollmentServiceTest extends TransactionalIntegrationTest { private Enrollment enrollmentChildA; + private Enrollment enrollmentGrandchildA; + private Event eventA; private TrackedEntity trackedEntityA; @@ -116,6 +120,8 @@ class EnrollmentServiceTest extends TransactionalIntegrationTest { private OrganisationUnit orgUnitA; + private OrganisationUnit orgUnitChildA; + @Override protected void setUpTest() throws Exception { userService = _userService; @@ -127,8 +133,10 @@ protected void setUpTest() throws Exception { manager.save(orgUnitB, false); OrganisationUnit orgUnitC = createOrganisationUnit('C'); manager.save(orgUnitC, false); - OrganisationUnit orgUnitChildA = createOrganisationUnit('D', orgUnitA); + orgUnitChildA = createOrganisationUnit('D', orgUnitA); manager.save(orgUnitChildA, false); + OrganisationUnit orgUnitGrandchildA = createOrganisationUnit('E', orgUnitChildA); + manager.save(orgUnitGrandchildA, false); User user = createAndAddUser(false, "user", Set.of(orgUnitA), Set.of(orgUnitA), "F_EXPORT_DATA"); @@ -162,6 +170,10 @@ protected void setUpTest() throws Exception { trackedEntityChildA.setTrackedEntityType(trackedEntityTypeA); manager.save(trackedEntityChildA, false); + TrackedEntity trackedEntityGrandchildA = createTrackedEntity(orgUnitGrandchildA); + trackedEntityGrandchildA.setTrackedEntityType(trackedEntityTypeA); + manager.save(trackedEntityGrandchildA, false); + programA = createProgram('A', new HashSet<>(), orgUnitA); programA.setProgramType(ProgramType.WITH_REGISTRATION); programA.setTrackedEntityType(trackedEntityTypeA); @@ -236,6 +248,10 @@ protected void setUpTest() throws Exception { programInstanceService.enrollTrackedEntity( trackedEntityChildA, programA, new Date(), new Date(), orgUnitChildA); + enrollmentGrandchildA = + programInstanceService.enrollTrackedEntity( + trackedEntityGrandchildA, programA, new Date(), new Date(), orgUnitGrandchildA); + injectSecurityContext(user); } @@ -412,7 +428,11 @@ void shouldGetEnrollmentsWhenUserHasReadAccessToProgramAndSearchScopeAccessToOrg assertNotNull(enrollments); assertContainsOnly( - List.of(enrollmentA.getUid(), enrollmentB.getUid(), enrollmentChildA.getUid()), + List.of( + enrollmentA.getUid(), + enrollmentB.getUid(), + enrollmentChildA.getUid(), + enrollmentGrandchildA.getUid()), uids(enrollments)); } @@ -433,7 +453,11 @@ void shouldGetEnrollmentsWhenUserHasReadAccessToProgramAndNoOrgUnitNorOrgUnitMod assertNotNull(enrollments); assertContainsOnly( - List.of(enrollmentA.getUid(), enrollmentB.getUid(), enrollmentChildA.getUid()), + List.of( + enrollmentA.getUid(), + enrollmentB.getUid(), + enrollmentChildA.getUid(), + enrollmentGrandchildA.getUid()), uids(enrollments)); } @@ -450,7 +474,9 @@ void shouldGetEnrollmentsInCaptureScopeIfOrgUnitModeCapture() List enrollments = enrollmentService.getEnrollments(params); assertNotNull(enrollments); - assertContainsOnly(List.of(enrollmentA.getUid(), enrollmentChildA.getUid()), uids(enrollments)); + assertContainsOnly( + List.of(enrollmentA.getUid(), enrollmentChildA.getUid(), enrollmentGrandchildA.getUid()), + uids(enrollments)); } @Test @@ -634,7 +660,11 @@ void shouldReturnAllEnrollmentsWhenModeAllAndUserAuthorizedAndInSearchScope() List enrollments = enrollmentService.getEnrollments(operationParams); assertContainsOnly( - List.of(enrollmentA.getUid(), enrollmentB.getUid(), enrollmentChildA.getUid()), + List.of( + enrollmentA.getUid(), + enrollmentB.getUid(), + enrollmentChildA.getUid(), + enrollmentGrandchildA.getUid()), uids(enrollments)); } @@ -660,7 +690,70 @@ void shouldReturnAllEnrollmentsWhenOrgUnitModeAllAndUserAuthorized() EnrollmentOperationParams.builder().orgUnitMode(ALL).build(); List enrollments = enrollmentService.getEnrollments(operationParams); - assertContainsOnly(List.of(enrollmentA, enrollmentB, enrollmentChildA), enrollments); + assertContainsOnly( + List.of(enrollmentA, enrollmentB, enrollmentChildA, enrollmentGrandchildA), enrollments); + } + + @Test + void shouldReturnAllDescendantsOfSelectedOrgUnitWhenOrgUnitModeDescendants() + throws ForbiddenException, BadRequestException, NotFoundException { + + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder() + .orgUnitUids(Set.of(orgUnitA.getUid())) + .orgUnitMode(DESCENDANTS) + .build(); + + List enrollments = enrollmentService.getEnrollments(operationParams); + assertContainsOnly( + List.of(enrollmentA.getUid(), enrollmentChildA.getUid(), enrollmentGrandchildA.getUid()), + uids(enrollments)); + } + + @Test + void shouldReturnChildrenOfRootOrgUnitWhenOrgUnitModeChildren() + throws ForbiddenException, BadRequestException, NotFoundException { + + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder() + .orgUnitUids(Set.of(orgUnitA.getUid())) + .orgUnitMode(CHILDREN) + .build(); + + List enrollments = enrollmentService.getEnrollments(operationParams); + assertContainsOnly(List.of(enrollmentA.getUid(), enrollmentChildA.getUid()), uids(enrollments)); + } + + @Test + void shouldReturnChildrenOfRequestedOrgUnitWhenOrgUnitModeChildren() + throws ForbiddenException, BadRequestException, NotFoundException { + + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder() + .orgUnitUids(Set.of(orgUnitChildA.getUid())) + .orgUnitMode(CHILDREN) + .build(); + + List enrollments = enrollmentService.getEnrollments(operationParams); + assertContainsOnly( + List.of(enrollmentChildA.getUid(), enrollmentGrandchildA.getUid()), uids(enrollments)); + } + + @Test + void + shouldReturnAllChildrenOfRequestedOrgUnitsWhenOrgUnitModeChildrenAndMultipleOrgUnitsRequested() + throws ForbiddenException, BadRequestException, NotFoundException { + + EnrollmentOperationParams operationParams = + EnrollmentOperationParams.builder() + .orgUnitUids(Set.of(orgUnitA.getUid(), orgUnitChildA.getUid())) + .orgUnitMode(CHILDREN) + .build(); + + List enrollments = enrollmentService.getEnrollments(operationParams); + assertContainsOnly( + List.of(enrollmentA.getUid(), enrollmentChildA.getUid(), enrollmentGrandchildA.getUid()), + uids(enrollments)); } private static List attributeUids(Enrollment enrollment) { diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java index 0345d5bbc338..6bac0f7f7a18 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/trackedentity/TrackedEntityServiceTest.java @@ -29,6 +29,7 @@ import static java.util.Collections.emptySet; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.ALL; +import static org.hisp.dhis.common.OrganisationUnitSelectionMode.CHILDREN; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.DESCENDANTS; import static org.hisp.dhis.common.OrganisationUnitSelectionMode.SELECTED; import static org.hisp.dhis.tracker.TrackerTestUtils.oneHourAfter; @@ -140,6 +141,8 @@ class TrackedEntityServiceTest extends IntegrationTestBase { private OrganisationUnit orgUnitB; + private OrganisationUnit orgUnitChildA; + private TrackedEntityAttribute teaA; private TrackedEntityAttribute teaC; @@ -164,6 +167,10 @@ class TrackedEntityServiceTest extends IntegrationTestBase { private TrackedEntity trackedEntityB; + private TrackedEntity trackedEntityChildA; + + private TrackedEntity trackedEntityGrandchildA; + private TrackedEntity trackedEntityC; private Note note; @@ -193,6 +200,16 @@ protected void setUpTest() throws Exception { manager.save(orgUnitB, false); OrganisationUnit orgUnitC = createOrganisationUnit('C'); manager.save(orgUnitC, false); + orgUnitChildA = createOrganisationUnit("childA"); + orgUnitChildA.setParent(orgUnitA); + manager.save(orgUnitChildA); + orgUnitA.setChildren(Set.of(orgUnitChildA)); + manager.update(orgUnitA); + OrganisationUnit orgUnitGrandchildA = createOrganisationUnit("grandchildA"); + orgUnitGrandchildA.setParent(orgUnitChildA); + manager.save(orgUnitGrandchildA); + orgUnitChildA.setChildren(Set.of(orgUnitGrandchildA)); + manager.update(orgUnitChildA); admin = preCreateInjectAdminUser(); admin.setOrganisationUnits(Set.of(orgUnitA, orgUnitB)); @@ -313,6 +330,14 @@ protected void setUpTest() throws Exception { trackedEntityA.setTrackedEntityType(trackedEntityTypeA); manager.save(trackedEntityA, false); + trackedEntityChildA = createTrackedEntity(orgUnitChildA); + trackedEntityChildA.setTrackedEntityType(trackedEntityTypeA); + manager.save(trackedEntityChildA, false); + + trackedEntityGrandchildA = createTrackedEntity(orgUnitGrandchildA); + trackedEntityGrandchildA.setTrackedEntityType(trackedEntityTypeA); + manager.save(trackedEntityGrandchildA, false); + enrollmentA = enrollmentService.enrollTrackedEntity( trackedEntityA, programA, new Date(), new Date(), orgUnitA); @@ -485,7 +510,9 @@ void shouldReturnTrackedEntitiesGivenUserHasDataReadAccessToTrackedEntityType() final List trackedEntities = trackedEntityService.getTrackedEntities(operationParams); - assertContainsOnly(List.of(trackedEntityA, trackedEntityB), trackedEntities); + assertContainsOnly( + List.of(trackedEntityA, trackedEntityB, trackedEntityChildA, trackedEntityGrandchildA), + trackedEntities); } @Test @@ -1439,7 +1466,14 @@ void shouldReturnAllEntitiesWhenAuthorizedUserAndInSearchScope() List trackedEntities = trackedEntityService.getTrackedEntities(operationParams); - assertContainsOnly(List.of(trackedEntityA, trackedEntityB, trackedEntityC), trackedEntities); + assertContainsOnly( + List.of( + trackedEntityA, + trackedEntityB, + trackedEntityC, + trackedEntityChildA, + trackedEntityGrandchildA), + trackedEntities); } @Test @@ -1464,6 +1498,60 @@ void shouldFailWhenModeAllUserCanSearchEverywhereButNotSuperuserAndNoAccessToPro ex.getMessage()); } + @Test + void shouldReturnChildrenOfRootOrgUnitWhenOrgUnitModeChildren() + throws ForbiddenException, BadRequestException, NotFoundException { + TrackedEntityOperationParams operationParams = + TrackedEntityOperationParams.builder() + .orgUnitMode(CHILDREN) + .organisationUnits(Set.of(orgUnitA.getUid())) + .trackedEntityTypeUid(trackedEntityTypeA.getUid()) + .user(user) + .build(); + + List trackedEntities = trackedEntityService.getTrackedEntities(operationParams); + assertContainsOnly( + Set.of(trackedEntityA.getUid(), trackedEntityChildA.getUid()), uids(trackedEntities)); + } + + @Test + void shouldReturnChildrenOfRequestedOrgUnitWhenOrgUnitModeChildren() + throws ForbiddenException, BadRequestException, NotFoundException { + TrackedEntityOperationParams operationParams = + TrackedEntityOperationParams.builder() + .orgUnitMode(CHILDREN) + .organisationUnits(Set.of(orgUnitChildA.getUid())) + .trackedEntityTypeUid(trackedEntityTypeA.getUid()) + .user(user) + .build(); + + List trackedEntities = trackedEntityService.getTrackedEntities(operationParams); + assertContainsOnly( + Set.of(trackedEntityChildA.getUid(), trackedEntityGrandchildA.getUid()), + uids(trackedEntities)); + } + + @Test + void + shouldReturnAllChildrenOfRequestedOrgUnitsWhenOrgUnitModeChildrenAndMultipleOrgUnitsRequested() + throws ForbiddenException, BadRequestException, NotFoundException { + TrackedEntityOperationParams operationParams = + TrackedEntityOperationParams.builder() + .orgUnitMode(CHILDREN) + .organisationUnits(Set.of(orgUnitA.getUid(), orgUnitChildA.getUid())) + .trackedEntityTypeUid(trackedEntityTypeA.getUid()) + .user(user) + .build(); + + List trackedEntities = trackedEntityService.getTrackedEntities(operationParams); + assertContainsOnly( + Set.of( + trackedEntityA.getUid(), + trackedEntityChildA.getUid(), + trackedEntityGrandchildA.getUid()), + uids(trackedEntities)); + } + @Test void shouldReturnAllEntitiesWhenSuperuserAndModeAll() throws ForbiddenException, BadRequestException, NotFoundException { From 5cd719cfbc00c4ffa554b83aa5737626ad656175 Mon Sep 17 00:00:00 2001 From: Enrico Colasante Date: Tue, 14 Nov 2023 11:09:41 +0100 Subject: [PATCH 60/63] chore: Make async tracker importer use scheduler (#15597) * chore: Make async tracker importer use scheduler * Fix tests * Fix tests * Fix tests * fix: run continuous jobs immediately [DHIS2-15276] * Fix tests * Fix tests * Fix transactional propagation in scheduler * Fix tests * Fix tests * Fix tests * Fix tests * Fix tests * Review fixes --------- Co-authored-by: Jan Bernitt --- .../org/hisp/dhis/scheduling/JobType.java | 3 +- .../HibernateJobConfigurationStore.java | 3 + .../dhis-service-tracker/pom.xml | 8 - .../imports/DefaultTrackerImportService.java | 225 ++++-------------- .../dhis/tracker/imports/ParamsConverter.java | 15 +- .../tracker/imports/TrackerIdSchemeParam.java | 3 +- .../imports/TrackerIdSchemeParams.java | 3 +- .../imports/TrackerIdentifierCollector.java | 11 +- .../tracker/imports/TrackerImportParams.java | 60 +---- .../tracker/imports/TrackerImportService.java | 22 +- .../bundle/DefaultTrackerBundleService.java | 10 +- .../imports/bundle/TrackerBundleService.java | 4 +- .../tracker/imports/domain/Attribute.java | 3 +- .../tracker/imports/domain/Coordinate.java | 3 +- .../tracker/imports/domain/DataValue.java | 3 +- .../tracker/imports/domain/Enrollment.java | 3 +- .../dhis/tracker/imports/domain/Event.java | 3 +- .../imports/domain/MetadataIdentifier.java | 3 +- .../dhis/tracker/imports/domain/Note.java | 3 +- .../tracker/imports/domain/Relationship.java | 3 +- .../imports/domain/RelationshipItem.java | 3 +- .../tracker/imports/domain/TrackedEntity.java | 3 +- .../imports/domain/TrackerObjects.java} | 43 ++-- .../dhis/tracker/imports/domain/User.java | 3 +- .../imports/job/TrackerImportThread.java | 62 ----- .../tracker/imports/job/TrackerMessage.java | 62 ----- .../imports/job/TrackerMessageManager.java | 89 ------- .../preheat/DefaultTrackerPreheatService.java | 13 +- .../preheat/TrackerPreheatService.java | 7 +- .../supplier/AbstractPreheatSupplier.java | 8 +- .../preheat/supplier/ClassBasedSupplier.java | 8 +- .../preheat/supplier/DefaultsSupplier.java | 4 +- .../DuplicateRelationshipSupplier.java | 6 +- .../preheat/supplier/EnrollmentSupplier.java | 4 +- ...nrollmentsWithAtLeastOneEventSupplier.java | 4 +- .../EventCategoryOptionComboSupplier.java | 6 +- .../EventProgramStageMapSupplier.java | 10 +- .../supplier/FileResourceSupplier.java | 13 +- .../supplier/OrgUnitValueTypeSupplier.java | 10 +- .../preheat/supplier/PeriodTypeSupplier.java | 4 +- .../preheat/supplier/PreheatSupplier.java | 5 +- .../supplier/ProgramOrgUnitsSupplier.java | 4 +- .../supplier/ProgramOwnerSupplier.java | 8 +- .../TrackedEntityEnrollmentSupplier.java | 8 +- .../supplier/UniqueAttributesSupplier.java | 23 +- .../preheat/supplier/UserSupplier.java | 8 +- .../supplier/UsernameValueTypeSupplier.java | 8 +- .../strategy/AbstractSchemaStrategy.java | 6 +- .../strategy/ClassBasedSupplierStrategy.java | 3 +- .../supplier/strategy/EnrollmentStrategy.java | 4 +- .../supplier/strategy/EventStrategy.java | 4 +- .../supplier/strategy/NoteStrategy.java | 4 +- .../strategy/RelationshipStrategy.java | 4 +- .../strategy/TrackerEntityStrategy.java | 4 +- .../tracker/imports/report/ImportReport.java | 15 +- .../tracker/imports/report/TimingsStats.java | 153 ------------ .../TrackerIdentifierCollectorTest.java | 46 ++-- .../bundle/TrackerImporterServiceTest.java | 40 ++-- .../DefaultTrackerPreheatServiceTest.java | 16 +- .../supplier/ClassBasedSupplierTest.java | 10 +- .../DuplicateRelationshipSupplierTest.java | 8 +- .../supplier/EnrollmentSupplierTest.java | 6 +- .../EventCategoryOptionComboSupplierTest.java | 48 ++-- .../supplier/FileResourceSupplierTest.java | 29 +-- .../OrgUnitValueTypeSupplierTest.java | 29 +-- .../supplier/PeriodTypeSupplierTest.java | 4 +- .../supplier/UniqueAttributeSupplierTest.java | 26 +- .../preheat/supplier/UserSupplierTest.java | 6 +- .../strategy/TrackerEntityStrategyTest.java | 8 +- .../imports/report/ImportReportTest.java | 4 +- .../report/TrackerBundleImportReportTest.java | 64 +---- .../tracker/TrackerImportExportActions.java | 8 + .../tracker/AclEventExporterTest.java | 5 +- .../org/hisp/dhis/tracker/TrackerTest.java | 24 +- .../OrderAndPaginationExporterTest.java | 5 +- .../export/event/AclEventExporterTest.java | 5 +- .../export/event/EventExporterTest.java | 5 +- .../imports/AtomicModeIntegrationTest.java | 16 +- .../imports/TrackerImportParamsSerdeTest.java | 16 +- .../imports/bundle/EventDataValueTest.java | 37 ++- .../imports/bundle/LastUpdateImportTest.java | 33 ++- .../tracker/imports/bundle/OwnershipTest.java | 116 ++++----- .../bundle/RelationshipImportTest.java | 25 +- .../ReportSummaryDeleteIntegrationTest.java | 39 +-- .../bundle/ReportSummaryIntegrationTest.java | 141 ++++++----- .../bundle/TrackedEntityAttributeTest.java | 13 +- .../TrackedEntityAttributeValueAuditTest.java | 15 +- .../TrackedEntityDataValueAuditTest.java | 8 +- ...dEntityProgramAttributeEncryptionTest.java | 2 + ...ntityProgramAttributeFileResourceTest.java | 2 + .../TrackedEntityProgramAttributeTest.java | 34 +-- .../bundle/TrackerBundleServiceTest.java | 9 +- .../bundle/TrackerEventBundleServiceTest.java | 16 +- .../TrackerProgramRuleBundleServiceTest.java | 9 +- .../TrackerSideEffectHandlerServiceTest.java | 2 + .../TrackerPreheatIdentifiersTest.java | 76 +++--- .../TrackerPreheatServiceIntegrationTest.java | 23 +- .../preheat/TrackerPreheatServiceTest.java | 46 ++-- .../ProgramRuleAssignActionTest.java | 22 +- .../imports/programrule/ProgramRuleTest.java | 87 ++++--- .../EnrollmentAttrValidationTest.java | 64 +++-- .../EnrollmentImportValidationTest.java | 82 ++++--- ...nrollmentSecurityImportValidationTest.java | 39 +-- .../validation/EventImportValidationTest.java | 90 ++++--- .../EventSecurityImportValidationTest.java | 24 +- .../TeTaEncryptionValidationTest.java | 26 +- .../validation/TeTaValidationTest.java | 40 ++-- .../TrackedEntityImportValidationTest.java | 103 ++++---- .../imports/TrackerImportControllerTest.java | 4 +- dhis-2/dhis-web-api/pom.xml | 4 - .../controller/tracker/imports/Body.java | 3 +- .../tracker/imports/TrackerAsyncImporter.java | 64 ----- .../imports/TrackerImportController.java | 108 ++++++--- .../tracker/imports/TrackerImportJob.java | 102 ++++++++ .../imports/TrackerImportParamsMapper.java | 32 +-- .../TrackerJobWebMessageResponse.java | 7 +- .../imports/TrackerImportControllerTest.java | 57 +++-- .../TrackerImportParamsMapperTest.java | 42 ++-- .../imports/TrackerImporterImplTest.java | 98 -------- 119 files changed, 1343 insertions(+), 1843 deletions(-) rename dhis-2/{dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java => dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java} (63%) delete mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java delete mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java delete mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java delete mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java delete mode 100644 dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java create mode 100644 dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java rename dhis-2/{dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job => dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports}/TrackerJobWebMessageResponse.java (92%) delete mode 100644 dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java index 7357c130c46c..7b51389db2d9 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java @@ -206,6 +206,7 @@ public boolean isUsingNotifications() { || this == DATAVALUE_IMPORT || this == COMPLETE_DATA_SET_REGISTRATION_IMPORT || this == METADATA_IMPORT + || this == TRACKER_IMPORT_JOB || this == GEOJSON_IMPORT; } @@ -231,7 +232,7 @@ public boolean isUsingErrorNotification() { * the ready jobs per type is attempted to start in a single loop cycle */ public boolean isUsingContinuousExecution() { - return this == METADATA_IMPORT; + return this == METADATA_IMPORT || this == TRACKER_IMPORT_JOB; } public boolean hasJobParameters() { diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java index be63df14bf74..44653469e464 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java @@ -29,6 +29,7 @@ import static java.lang.Math.max; import static java.util.stream.Collectors.toSet; +import static org.springframework.transaction.annotation.Propagation.REQUIRES_NEW; import java.util.List; import java.util.Set; @@ -45,6 +46,7 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; /** * @author Jan Bernitt @@ -242,6 +244,7 @@ public Stream getDueJobConfigurations(boolean includeWaiting) } @Override + @Transactional(propagation = REQUIRES_NEW) public boolean tryExecuteNow(@Nonnull String jobId) { // language=SQL String sql = diff --git a/dhis-2/dhis-services/dhis-service-tracker/pom.xml b/dhis-2/dhis-services/dhis-service-tracker/pom.xml index 393e2d329c1a..542a8b642f0d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/pom.xml +++ b/dhis-2/dhis-services/dhis-service-tracker/pom.xml @@ -65,10 +65,6 @@ org.hisp.dhis.rules rule-engine - - org.springframework - spring-core - org.springframework spring-jdbc @@ -89,10 +85,6 @@ org.springframework spring-beans - - org.springframework.security - spring-security-core - org.projectlombok lombok diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java index ccf754014a01..b203d58bbc68 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java @@ -27,35 +27,25 @@ */ package org.hisp.dhis.tracker.imports; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.COMMIT_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREHEAT_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREPROCESS_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PROGRAMRULE_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.TOTAL_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.VALIDATE_PROGRAMRULE_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.VALIDATION_OPS; - import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nonnull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.hisp.dhis.system.notification.NotificationLevel; -import org.hisp.dhis.system.notification.Notifier; +import org.hisp.dhis.scheduling.JobProgress; import org.hisp.dhis.tracker.TrackerType; import org.hisp.dhis.tracker.imports.bundle.TrackerBundle; import org.hisp.dhis.tracker.imports.bundle.TrackerBundleService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.job.TrackerSideEffectDataBundle; import org.hisp.dhis.tracker.imports.preprocess.TrackerPreprocessService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.report.Status; -import org.hisp.dhis.tracker.imports.report.TimingsStats; import org.hisp.dhis.tracker.imports.report.TrackerTypeReport; import org.hisp.dhis.tracker.imports.report.ValidationReport; import org.hisp.dhis.tracker.imports.validation.ValidationResult; @@ -78,144 +68,78 @@ public class DefaultTrackerImportService implements TrackerImportService { @Nonnull private final TrackerUserService trackerUserService; - @Nonnull private final Notifier notifier; - + /* Import is not meant to be annotated with @Transactional. + * PreHeat and Commit phases are separated transactions, other + * phases do not need to be in a transaction. */ @Override - public ImportReport importTracker(TrackerImportParams params) { + public ImportReport importTracker( + TrackerImportParams params, TrackerObjects trackerObjects, JobProgress jobProgress) { User user = trackerUserService.getUser(params.getUserId()); - params.setUser(user); - - TimingsStats opsTimer = new TimingsStats(); - - startImport(params); - - try { - TrackerBundle trackerBundle = preHeat(params, opsTimer); - - Map bundleSize = calculatePayloadSize(trackerBundle); - - preProcess(opsTimer, trackerBundle); - - ValidationReport validationReport = validate(params, opsTimer, trackerBundle); - if (exitOnError(validationReport, params)) { - return buildReportAndNotify(params, validationReport, opsTimer, bundleSize); - } + jobProgress.startingStage("Running PreHeat"); + TrackerBundle trackerBundle = + jobProgress.runStage(() -> trackerBundleService.create(params, trackerObjects, user)); - PersistenceReport persistenceReport = commit(params, opsTimer, trackerBundle); + jobProgress.startingStage("Calculating Payload Size"); + Map bundleSize = + jobProgress.runStage(() -> calculatePayloadSize(trackerBundle)); - postCommit(trackerBundle); + jobProgress.startingStage("Running PreProcess"); + jobProgress.runStage(() -> trackerPreprocessService.preprocess(trackerBundle)); - ImportReport importReport = - ImportReport.withImportCompleted( - Status.OK, persistenceReport, validationReport, opsTimer.stopTimer(), bundleSize); + jobProgress.startingStage("Running Validation"); + ValidationResult validationResult = jobProgress.runStage(() -> validateBundle(trackerBundle)); - endImport(params, importReport); + ValidationReport validationReport = ValidationReport.fromResult(validationResult); - return importReport; - } catch (Exception e) { - log.error("Exception thrown during import.", e); - - ImportReport report = - ImportReport.withError( - "Exception:" + e.getMessage(), ValidationReport.emptyReport(), opsTimer.stopTimer()); - - endImportWithError(params, report, e); - - return report; + if (!trackerBundle.isSkipRuleEngine() && !params.getImportStrategy().isDelete()) { + jobProgress.startingStage("Running Rule Engine"); + jobProgress.runStage(() -> trackerBundleService.runRuleEngine(trackerBundle)); + + jobProgress.startingStage("Running Rule Engine Validation"); + ValidationResult result = + jobProgress.runStage(() -> validationService.validateRuleEngine(trackerBundle)); + trackerBundle.setTrackedEntities(result.getTrackedEntities()); + trackerBundle.setEnrollments(result.getEnrollments()); + trackerBundle.setEvents(result.getEvents()); + trackerBundle.setRelationships(result.getRelationships()); + + validationReport = ValidationReport.merge(validationResult, result); } - } - - private TrackerBundle preHeat(TrackerImportParams params, TimingsStats opsTimer) { - TrackerBundle trackerBundle = opsTimer.exec(PREHEAT_OPS, () -> preheatBundle(params)); - - notifyOps(params, PREHEAT_OPS, opsTimer); - return trackerBundle; - } - - private void preProcess(TimingsStats opsTimer, TrackerBundle trackerBundle) { - opsTimer.execVoid(PREPROCESS_OPS, () -> preProcessBundle(trackerBundle)); - } - - private ValidationReport validate( - TrackerImportParams params, TimingsStats opsTimer, TrackerBundle trackerBundle) { - ValidationResult validationResult = - opsTimer.exec(VALIDATION_OPS, () -> validateBundle(params, trackerBundle, opsTimer)); + if (exitOnError(validationReport, params)) { + return ImportReport.withValidationErrors( + validationReport, bundleSize.values().stream().mapToInt(Integer::intValue).sum()); + } - if (!trackerBundle.isSkipRuleEngine() && !params.getImportStrategy().isDelete()) { - ValidationResult ruleEnginevalidationResult = execRuleEngine(params, opsTimer, trackerBundle); + jobProgress.startingStage("Commit Transaction"); + PersistenceReport persistenceReport = jobProgress.runStage(() -> commit(params, trackerBundle)); - return ValidationReport.merge(validationResult, ruleEnginevalidationResult); - } + jobProgress.startingStage("PostCommit"); + jobProgress.runStage(() -> trackerBundleService.postCommit(trackerBundle)); - return ValidationReport.fromResult(validationResult); + return ImportReport.withImportCompleted( + Status.OK, persistenceReport, validationReport, bundleSize); } - private PersistenceReport commit( - TrackerImportParams params, TimingsStats opsTimer, TrackerBundle trackerBundle) { - PersistenceReport persistenceReport; + private PersistenceReport commit(TrackerImportParams params, TrackerBundle trackerBundle) { if (TrackerImportStrategy.DELETE == params.getImportStrategy()) { - persistenceReport = opsTimer.exec(COMMIT_OPS, () -> deleteBundle(trackerBundle)); + return deleteBundle(trackerBundle); } else { - persistenceReport = opsTimer.exec(COMMIT_OPS, () -> commitBundle(trackerBundle)); + return commitBundle(trackerBundle); } - - notifyOps(params, COMMIT_OPS, opsTimer); - return persistenceReport; - } - - private void postCommit(TrackerBundle trackerBundle) { - trackerBundleService.postCommit(trackerBundle); } - protected ValidationResult validateBundle( - TrackerImportParams params, TrackerBundle bundle, TimingsStats opsTimer) { + protected ValidationResult validateBundle(TrackerBundle bundle) { ValidationResult result = validationService.validate(bundle); bundle.setTrackedEntities(result.getTrackedEntities()); bundle.setEnrollments(result.getEnrollments()); bundle.setEvents(result.getEvents()); bundle.setRelationships(result.getRelationships()); - notifyOps(params, VALIDATION_OPS, opsTimer); - - return result; - } - - private ValidationResult execRuleEngine( - TrackerImportParams params, TimingsStats opsTimer, TrackerBundle bundle) { - opsTimer.execVoid(PROGRAMRULE_OPS, () -> trackerBundleService.runRuleEngine(bundle)); - - notifyOps(params, PROGRAMRULE_OPS, opsTimer); - - ValidationResult result = - opsTimer.exec(VALIDATE_PROGRAMRULE_OPS, () -> validationService.validateRuleEngine(bundle)); - bundle.setTrackedEntities(result.getTrackedEntities()); - bundle.setEnrollments(result.getEnrollments()); - bundle.setEvents(result.getEvents()); - bundle.setRelationships(result.getRelationships()); - - notifyOps(params, VALIDATE_PROGRAMRULE_OPS, opsTimer); - return result; } - private ImportReport buildReportAndNotify( - TrackerImportParams params, - ValidationReport validationReport, - TimingsStats opsTimer, - Map bundleSize) { - ImportReport importReport = - ImportReport.withValidationErrors( - validationReport, - opsTimer.stopTimer(), - bundleSize.values().stream().mapToInt(Integer::intValue).sum()); - - endImport(params, importReport); - - return importReport; - } - private boolean exitOnError(ValidationReport validationReport, TrackerImportParams params) { return validationReport.hasErrors() && params.getAtomicMode() == AtomicMode.ALL; } @@ -228,14 +152,6 @@ private Map calculatePayloadSize(TrackerBundle bundle) { TrackerType.RELATIONSHIP, bundle.getRelationships().size()); } - protected TrackerBundle preheatBundle(TrackerImportParams params) { - return trackerBundleService.create(params); - } - - protected void preProcessBundle(TrackerBundle bundle) { - trackerPreprocessService.preprocess(bundle); - } - protected PersistenceReport commitBundle(TrackerBundle trackerBundle) { PersistenceReport persistenceReport = trackerBundleService.commit(trackerBundle); @@ -244,7 +160,7 @@ protected PersistenceReport commitBundle(TrackerBundle trackerBundle) { Stream.of(TrackerType.ENROLLMENT, TrackerType.EVENT) .map(trackerType -> safelyGetSideEffectsDataBundles(persistenceReport, trackerType)) .flatMap(Collection::stream) - .collect(Collectors.toList()); + .toList(); trackerBundleService.handleTrackerSideEffects(sideEffectDataBundles); } @@ -265,48 +181,6 @@ protected PersistenceReport deleteBundle(TrackerBundle trackerBundle) { return trackerBundleService.delete(trackerBundle); } - private void startImport(TrackerImportParams params) { - if (null != params.getJobConfiguration()) { - notifier.notify(params.getJobConfiguration(), params.userStartInfo() + " Import:Start"); - } - } - - private void notifyOps(TrackerImportParams params, String validationOps, TimingsStats opsTimer) { - if (null != params.getJobConfiguration()) { - notifier.update( - params.getJobConfiguration(), - NotificationLevel.DEBUG, - params - + validationOps - + " completed in " - + opsTimer.get(validationOps) - + " Import:" - + validationOps); - } - } - - private void endImport(TrackerImportParams params, ImportReport importReport) { - if (null != params.getJobConfiguration()) { - notifier.update( - params.getJobConfiguration(), - params + " finished in " + importReport.getTimingsStats().get(TOTAL_OPS) + " Import:Done", - true); - - notifier.addJobSummary(params.getJobConfiguration(), importReport, ImportReport.class); - } - } - - private void endImportWithError( - TrackerImportParams params, ImportReport importReport, Exception e) { - notifier.update( - params.getJobConfiguration(), - NotificationLevel.ERROR, - params + " failed with exception: " + e.getMessage() + " Import:Error", - true); - - notifier.addJobSummary(params.getJobConfiguration(), importReport, ImportReport.class); - } - /** * Clone the TrackerImportReport and filters out validation data based on the provided {@link * PersistenceReport}. @@ -328,11 +202,10 @@ public ImportReport buildImportReport( if (originalValidationReport != null) { validationReport.addErrors(originalValidationReport.getErrors()); } - if (originalValidationReport != null && TrackerBundleReportMode.WARNINGS == reportMode) { - validationReport.addWarnings(originalValidationReport.getWarnings()); - } else if (originalValidationReport != null && TrackerBundleReportMode.FULL == reportMode) { + if (originalValidationReport != null + && (TrackerBundleReportMode.WARNINGS == reportMode + || TrackerBundleReportMode.FULL == reportMode)) { validationReport.addWarnings(originalValidationReport.getWarnings()); - importReportBuilder.timingsStats(originalImportReport.getTimingsStats()); } importReportBuilder.validationReport(validationReport); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java index 927c04736253..3aaafa746dd5 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java @@ -28,12 +28,15 @@ package org.hisp.dhis.tracker.imports; import org.hisp.dhis.tracker.imports.bundle.TrackerBundle; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.user.User; /** * @author Luciano Fiandesio */ public class ParamsConverter { - public static TrackerBundle convert(TrackerImportParams params) { + public static TrackerBundle convert( + TrackerImportParams params, TrackerObjects trackerObjects, User user) { return TrackerBundle.builder() .importMode(params.getImportMode()) .importStrategy(params.getImportStrategy()) @@ -42,11 +45,11 @@ public static TrackerBundle convert(TrackerImportParams params) { .skipRuleEngine(params.isSkipRuleEngine()) .flushMode(params.getFlushMode()) .validationMode(params.getValidationMode()) - .trackedEntities(params.getTrackedEntities()) - .enrollments(params.getEnrollments()) - .events(params.getEvents()) - .relationships(params.getRelationships()) - .user(params.getUser()) + .trackedEntities(trackerObjects.getTrackedEntities()) + .enrollments(trackerObjects.getEnrollments()) + .events(trackerObjects.getEvents()) + .relationships(trackerObjects.getRelationships()) + .user(user) .build(); } } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java index cde712ce7863..161bc0bc8905 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import java.io.Serializable; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -50,7 +51,7 @@ // which is invalid. Drop @OpenApi.Property annotation after implementing support for the unpacking // of query param classes in OpenApiGenerator @OpenApi.Property(value = TrackerIdScheme.class) -public class TrackerIdSchemeParam { +public class TrackerIdSchemeParam implements Serializable { public static final TrackerIdSchemeParam UID = TrackerIdSchemeParam.of(TrackerIdScheme.UID, null); public static final TrackerIdSchemeParam CODE = diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java index 83760db26294..a2fb0826b1e5 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -50,7 +51,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TrackerIdSchemeParams { +public class TrackerIdSchemeParams implements Serializable { /** Specific identifier to match data elements on. */ @JsonProperty @Builder.Default private TrackerIdSchemeParam dataElementIdScheme = TrackerIdSchemeParam.UID; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java index d64c2653dc04..7467d89bb261 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java @@ -53,6 +53,7 @@ import org.hisp.dhis.tracker.imports.domain.Note; import org.hisp.dhis.tracker.imports.domain.Relationship; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.springframework.stereotype.Component; /** @@ -70,12 +71,12 @@ public class TrackerIdentifierCollector { private final ProgramRuleService programRuleService; - public Map, Set> collect(TrackerImportParams params) { + public Map, Set> collect(TrackerObjects trackerObjects) { final Map, Set> identifiers = new HashMap<>(); - collectTrackedEntities(identifiers, params.getTrackedEntities()); - collectEnrollments(identifiers, params.getEnrollments()); - collectEvents(identifiers, params.getEvents()); - collectRelationships(identifiers, params.getRelationships()); + collectTrackedEntities(identifiers, trackerObjects.getTrackedEntities()); + collectEnrollments(identifiers, trackerObjects.getEnrollments()); + collectEvents(identifiers, trackerObjects.getEvents()); + collectRelationships(identifiers, trackerObjects.getRelationships()); collectProgramRulesFields(identifiers); return identifiers; } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java index df96cda1f128..6b5fc80f54fe 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java @@ -28,21 +28,12 @@ package org.hisp.dhis.tracker.imports; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobType; +import org.hisp.dhis.scheduling.JobParameters; import org.hisp.dhis.tracker.imports.bundle.TrackerBundleMode; -import org.hisp.dhis.tracker.imports.domain.Enrollment; -import org.hisp.dhis.tracker.imports.domain.Event; -import org.hisp.dhis.tracker.imports.domain.Relationship; -import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.user.User; /** * @author Morten Olav Hansen @@ -51,13 +42,10 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TrackerImportParams { +public class TrackerImportParams implements JobParameters { /** User uid to use for import job. */ @JsonProperty private String userId; - /** User to use for import job. */ - private User user; - /** Should import be imported or just validated. */ @JsonProperty @Builder.Default private final TrackerBundleMode importMode = TrackerBundleMode.COMMIT; @@ -91,50 +79,6 @@ public class TrackerImportParams { /** Name of file that was used for import (if available). */ @JsonProperty @Builder.Default private final String filename = null; - /** Job configuration */ - private JobConfiguration jobConfiguration; - @JsonProperty @Builder.Default private TrackerBundleReportMode reportMode = TrackerBundleReportMode.ERRORS; - - /** Tracked entities to import. */ - @JsonProperty @Builder.Default - private final List trackedEntities = new ArrayList<>(); - - /** Enrollments to import. */ - @JsonProperty @Builder.Default private final List enrollments = new ArrayList<>(); - - /** Events to import. */ - @JsonProperty @Builder.Default private final List events = new ArrayList<>(); - - /** Relationships to import. */ - @JsonProperty @Builder.Default private final List relationships = new ArrayList<>(); - - public TrackerImportParams setUser(User user) { - this.user = user; - - if (user != null) { - this.userId = user.getUid(); - } - - return this; - } - - @JsonProperty - public String getUsername() { - return User.username(user); - } - - @Override - public String toString() { - return Optional.ofNullable(this.getJobConfiguration()) - .map( - jobConfiguration -> - JobType.TRACKER_IMPORT_JOB + " ( " + jobConfiguration.getUid() + " )") - .orElse(JobType.TRACKER_IMPORT_JOB.toString()); - } - - public String userStartInfo() { - return this + " started by " + this.getUsername() + " ( " + this.userId + " )"; - } } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java index 23d3222af8cc..caa72a9b64f8 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java @@ -27,6 +27,9 @@ */ package org.hisp.dhis.tracker.imports; +import org.hisp.dhis.scheduling.JobProgress; +import org.hisp.dhis.scheduling.NoopJobProgress; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; /** @@ -37,10 +40,25 @@ public interface TrackerImportService { * Import object using provided params. Takes the objects through all phases of the importer from * preheating to validation, and then finished with a commit (unless its validate only) * - * @param params Parameters for import, including objects + * @param params Parameters for import + * @param trackerObjects the objects to import * @return Report giving status of import (and any errors) */ - ImportReport importTracker(TrackerImportParams params); + default ImportReport importTracker(TrackerImportParams params, TrackerObjects trackerObjects) { + return importTracker(params, trackerObjects, NoopJobProgress.INSTANCE); + } + + /** + * Import object using provided params. Takes the objects through all phases of the importer from + * preheating to validation, and then finished with a commit (unless its validate only) + * + * @param params Parameters for import + * @param trackerObjects the objects to import + * @param jobProgress to track import progress + * @return Report giving status of import (and any errors) + */ + ImportReport importTracker( + TrackerImportParams params, TrackerObjects trackerObjects, JobProgress jobProgress); /** * Build the report based on the mode selected by the client. diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java index 0374ea7aa1b7..a8699eadad70 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java @@ -41,6 +41,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.bundle.persister.CommitService; import org.hisp.dhis.tracker.imports.bundle.persister.TrackerObjectDeletionService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.job.TrackerSideEffectDataBundle; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheatService; @@ -48,6 +49,7 @@ import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.report.TrackerTypeReport; import org.hisp.dhis.tracker.imports.sideeffect.SideEffectHandlerService; +import org.hisp.dhis.user.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -78,9 +80,11 @@ public void setSideEffectHandlers(List sideEffectHandl } @Override - public TrackerBundle create(TrackerImportParams params) { - TrackerBundle trackerBundle = ParamsConverter.convert(params); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + public TrackerBundle create( + TrackerImportParams params, TrackerObjects trackerObjects, User user) { + TrackerBundle trackerBundle = ParamsConverter.convert(params, trackerObjects, user); + TrackerPreheat preheat = + trackerPreheatService.preheat(trackerObjects, params.getIdSchemes(), user); trackerBundle.setPreheat(preheat); return trackerBundle; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java index af8e46e72472..cdb50aee5cda 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java @@ -29,8 +29,10 @@ import java.util.List; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.job.TrackerSideEffectDataBundle; import org.hisp.dhis.tracker.imports.report.PersistenceReport; +import org.hisp.dhis.user.User; /** * @author Morten Olav Hansen @@ -42,7 +44,7 @@ public interface TrackerBundleService { * @param params Params object for this bundle. * @return Configured TrackerBundle instance(s) (if bundle splitting is enabled) */ - TrackerBundle create(TrackerImportParams params); + TrackerBundle create(TrackerImportParams params, TrackerObjects trackerObjects, User user); /** * Call rule engine for tracker bundle. diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java index be0ccf18d421..37134c2f6bff 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -42,7 +43,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Attribute { +public class Attribute implements Serializable { @JsonProperty private MetadataIdentifier attribute; @JsonProperty private String code; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java index 567290315e17..b00612269568 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -41,7 +42,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Coordinate { +public class Coordinate implements Serializable { @JsonProperty private Double latitude; @JsonProperty private Double longitude; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java index fd1e6689c491..d0b0a7de9f93 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -41,7 +42,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class DataValue { +public class DataValue implements Serializable { @JsonProperty private Instant createdAt; @JsonProperty private Instant updatedAt; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java index d5ec22ed7d47..0e702d9bbf81 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -45,7 +46,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Enrollment implements TrackerDto { +public class Enrollment implements TrackerDto, Serializable { @JsonProperty private String enrollment; @JsonProperty private Instant createdAt; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java index 4b30f68fb4c1..5298abab4e03 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.HashSet; @@ -49,7 +50,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Event implements TrackerDto { +public class Event implements TrackerDto, Serializable { @JsonProperty private String event; @JsonProperty @Builder.Default private EventStatus status = EventStatus.ACTIVE; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java index 3b28029e61b4..3ad1b265787b 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.util.Objects; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -57,7 +58,7 @@ */ @Value @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class MetadataIdentifier { +public class MetadataIdentifier implements Serializable { public static final MetadataIdentifier EMPTY_UID = MetadataIdentifier.ofUid((String) null); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java index cec45da897d7..5401ed822ccc 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -44,7 +45,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Note { +public class Note implements Serializable { @JsonProperty private String note; @JsonProperty private Instant storedAt; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java index 5219571ab623..83beb87b27a5 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -42,7 +43,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Relationship implements TrackerDto { +public class Relationship implements TrackerDto, Serializable { @JsonProperty private String relationship; @JsonProperty private String relationshipName; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java index 12e022a460ae..cc80e0be0337 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -40,7 +41,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class RelationshipItem { +public class RelationshipItem implements Serializable { @JsonProperty private String trackedEntity; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java index 7aee6fba58e9..29eaf07e3f9d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -45,7 +46,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TrackedEntity implements TrackerDto { +public class TrackedEntity implements TrackerDto, Serializable { @JsonProperty private String trackedEntity; @JsonProperty private MetadataIdentifier trackedEntityType; diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java similarity index 63% rename from dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java rename to dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java index c48ae7a81316..02a8a89dba76 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java @@ -25,27 +25,30 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.hisp.dhis.webapi.controller.tracker.imports; +package org.hisp.dhis.tracker.imports.domain; -import javax.annotation.Nonnull; -import lombok.RequiredArgsConstructor; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.report.ImportReport; -import org.springframework.stereotype.Component; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; -/** - * @author Luca Cambi - */ -@Component -@RequiredArgsConstructor -public class TrackerSyncImporter { - - @Nonnull private final TrackerImportService trackerImportService; - - public ImportReport importTracker(TrackerImportParams params) { - ImportReport importReport = trackerImportService.importTracker(params); +@Getter +@ToString +@EqualsAndHashCode +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TrackerObjects implements Serializable { + @JsonProperty @Builder.Default + private final List trackedEntities = new ArrayList<>(); - return trackerImportService.buildImportReport(importReport, params.getReportMode()); - } + @JsonProperty @Builder.Default private final List enrollments = new ArrayList<>(); + @JsonProperty @Builder.Default private final List events = new ArrayList<>(); + @JsonProperty @Builder.Default private final List relationships = new ArrayList<>(); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java index d30e8891540e..0509c17bad16 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java @@ -30,6 +30,7 @@ import static org.apache.commons.lang3.StringUtils.isBlank; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -42,7 +43,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class User { +public class User implements Serializable { @JsonProperty private String uid; @JsonProperty private String username; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java deleted file mode 100644 index cb2796a2cb23..000000000000 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.tracker.imports.job; - -import org.hisp.dhis.security.SecurityContextRunnable; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; -import org.springframework.util.Assert; - -/** - * @author Morten Olav Hansen - */ -@Component -@Scope(BeanDefinition.SCOPE_PROTOTYPE) -public class TrackerImportThread extends SecurityContextRunnable { - private final TrackerImportService trackerImportService; - - private TrackerImportParams trackerImportParams; - - public TrackerImportThread(TrackerImportService trackerImportService) { - this.trackerImportService = trackerImportService; - } - - @Override - public void call() { - Assert.notNull(trackerImportParams, "Field trackerImportParams can not be null. "); - - trackerImportService.importTracker(trackerImportParams); // discard returned report - } - - public void setTrackerImportParams(TrackerImportParams trackerImportParams) { - this.trackerImportParams = trackerImportParams; - } -} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java deleted file mode 100644 index ab8bcb5ceaab..000000000000 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.tracker.imports.job; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import lombok.Builder; -import lombok.Value; -import org.hisp.dhis.artemis.MessageType; -import org.hisp.dhis.artemis.SerializableMessage; -import org.hisp.dhis.tracker.imports.TrackerImportParams; - -/** - * Used by Apache Artemis to pass tracker import jobs from the /api/tracker endpoint to the tracker - * import services. - * - * @author Morten Olav Hansen - */ -@Value -@Builder(builderClassName = "TrackerMessageBuilder") -@JsonDeserialize(builder = TrackerMessage.TrackerMessageBuilder.class) -public class TrackerMessage implements SerializableMessage { - @JsonProperty private final String uid; - - @JsonProperty private final String authentication; - - @JsonProperty private final TrackerImportParams trackerImportParams; - - @Override - public MessageType getMessageType() { - return MessageType.TRACKER_JOB; - } - - @JsonPOJOBuilder(withPrefix = "") - public static final class TrackerMessageBuilder {} -} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java deleted file mode 100644 index ef8d8abfbef7..000000000000 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.tracker.imports.job; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import javax.jms.JMSException; -import javax.jms.TextMessage; -import org.hisp.dhis.artemis.Topics; -import org.hisp.dhis.common.AsyncTaskExecutor; -import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobType; -import org.hisp.dhis.security.AuthenticationSerializer; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.springframework.beans.factory.ObjectFactory; -import org.springframework.jms.annotation.JmsListener; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; - -/** - * @author Morten Olav Hansen - */ -@Component -public class TrackerMessageManager { - private final ObjectMapper objectMapper; - - private final AsyncTaskExecutor taskExecutor; - - private final ObjectFactory trackerImportThreadFactory; - - public TrackerMessageManager( - ObjectMapper objectMapper, - AsyncTaskExecutor taskExecutor, - ObjectFactory trackerImportThreadFactory) { - this.objectMapper = objectMapper; - this.taskExecutor = taskExecutor; - this.trackerImportThreadFactory = trackerImportThreadFactory; - } - - @JmsListener( - destination = Topics.TRACKER_IMPORT_JOB_TOPIC_NAME, - containerFactory = "jmsQueueListenerContainerFactory") - public void consume(TextMessage message) throws JMSException, JsonProcessingException { - String payload = message.getText(); - - TrackerMessage trackerMessage = objectMapper.readValue(payload, TrackerMessage.class); - TrackerImportParams trackerImportParams = trackerMessage.getTrackerImportParams(); - - JobConfiguration jobConfiguration = - new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, trackerImportParams.getUserId()); - - jobConfiguration.setUid(trackerMessage.getUid()); - trackerImportParams.setJobConfiguration(jobConfiguration); - - TrackerImportThread trackerImportThread = trackerImportThreadFactory.getObject(); - trackerImportThread.setTrackerImportParams(trackerImportParams); - - SecurityContextHolder.getContext() - .setAuthentication( - AuthenticationSerializer.deserialize(trackerMessage.getAuthentication())); - - taskExecutor.executeTask(trackerImportThread); - } -} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java index 3051680314c2..c2de4078f69d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java @@ -36,8 +36,10 @@ import lombok.extern.slf4j.Slf4j; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.preheat.PreheatException; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.supplier.PreheatSupplier; +import org.hisp.dhis.user.User; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; @@ -70,17 +72,18 @@ public void setApplicationContext(ApplicationContext applicationContext) throws @Override @Transactional(readOnly = true) - public TrackerPreheat preheat(TrackerImportParams params) { + public TrackerPreheat preheat( + TrackerObjects trackerObjects, TrackerIdSchemeParams idSchemeParams, User user) { TrackerPreheat preheat = new TrackerPreheat(); - preheat.setIdSchemes(params.getIdSchemes()); - preheat.setUser(params.getUser()); + preheat.setIdSchemes(idSchemeParams); + preheat.setUser(user); checkNotNull(preheat.getUser(), "TrackerPreheat is missing the user object."); for (String supplier : preheatSuppliers) { final String beanName = Introspector.decapitalize(supplier); try { - ctx.getBean(beanName, PreheatSupplier.class).add(params, preheat); + ctx.getBean(beanName, PreheatSupplier.class).add(trackerObjects, preheat); } catch (BeansException beanException) { processException( "Unable to find a preheat supplier with name " diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java index 83425bab3a07..05b97823a1ca 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java @@ -27,7 +27,9 @@ */ package org.hisp.dhis.tracker.imports.preheat; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.user.User; /** * @author Morten Olav Hansen @@ -39,5 +41,6 @@ public interface TrackerPreheatService { * * @param params Params for preheating */ - TrackerPreheat preheat(TrackerImportParams params); + TrackerPreheat preheat( + TrackerObjects trackerObjects, TrackerIdSchemeParams idSchemeParams, User user); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java index 0b344e8e4d82..8a7d1958a208 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java @@ -33,7 +33,7 @@ import org.apache.commons.lang3.time.StopWatch; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.hibernate.HibernateProxyUtils; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; @@ -50,7 +50,7 @@ public abstract class AbstractPreheatSupplier implements PreheatSupplier { private final long CACHE_CAPACITY = 1000; @Override - public void add(TrackerImportParams params, TrackerPreheat preheat) { + public void add(TrackerObjects trackerObjects, TrackerPreheat preheat) { StopWatch watch = null; if (log.isDebugEnabled()) { log.debug("Executing preheat supplier: {}", this.getClass().getName()); @@ -58,7 +58,7 @@ public void add(TrackerImportParams params, TrackerPreheat preheat) { watch.start(); } - preheatAdd(params, preheat); + preheatAdd(trackerObjects, preheat); if (log.isDebugEnabled()) { if (watch != null && watch.isStarted()) { @@ -72,7 +72,7 @@ public void add(TrackerImportParams params, TrackerPreheat preheat) { } /** Template method: executes preheat logic from the subclass */ - public abstract void preheatAdd(TrackerImportParams params, TrackerPreheat preheat); + public abstract void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat); protected void addToCache(PreheatCacheService cache, List objects) { objects.forEach( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java index 831441c6dc90..93c256b92412 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java @@ -35,7 +35,7 @@ import java.util.Set; import lombok.RequiredArgsConstructor; import org.hisp.dhis.tracker.imports.TrackerIdentifierCollector; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.ClassBasedSupplierStrategy; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.GenericStrategy; @@ -67,13 +67,13 @@ public class ClassBasedSupplier extends AbstractPreheatSupplier implements Appli private final Map classStrategies; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { /* * Collects all references from the payload and create a Map where key * is the reference type (e.g. Enrollment) and the value is a Set of * identifiers (e.g. a list of all Enrollment UIDs found in the payload) */ - Map, Set> identifierMap = identifierCollector.collect(params); + Map, Set> identifierMap = identifierCollector.collect(trackerObjects); identifierMap.forEach( (key, identifiers) -> { @@ -90,7 +90,7 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { } else { context .getBean(Introspector.decapitalize(bean), ClassBasedSupplierStrategy.class) - .add(params, splitList, preheat); + .add(splitList, preheat); } }); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java index bf12d2c46db3..7db809ab2c3c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java @@ -36,7 +36,7 @@ import org.hisp.dhis.category.CategoryOptionCombo; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; import org.hisp.dhis.tracker.imports.preheat.mappers.CategoryComboMapper; @@ -59,7 +59,7 @@ public class DefaultsSupplier extends AbstractPreheatSupplier { @Nonnull private final PreheatCacheService cache; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { // not using manager.getDefaults() as the collections of the entities // are still hibernate proxies // this leads to lazy init exceptions with - no session. reason is the diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java index a91c405021ba..89ec6171e11c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java @@ -34,8 +34,8 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.relationship.RelationshipStore; import org.hisp.dhis.relationship.RelationshipType; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Relationship; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.RelationshipMapper; import org.hisp.dhis.tracker.imports.util.RelationshipKeySupport; @@ -47,9 +47,9 @@ public class DuplicateRelationshipSupplier extends AbstractPreheatSupplier { @Nonnull private final RelationshipStore relationshipStore; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List relationships = - retrieveRelationshipKeys(params.getRelationships(), preheat); + retrieveRelationshipKeys(trackerObjects.getRelationships(), preheat); relationships.stream() .map(RelationshipMapper.INSTANCE::map) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java index f8c9338257d0..e26b40d99e51 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java @@ -36,7 +36,7 @@ import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStore; import org.hisp.dhis.program.ProgramType; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.EnrollmentMapper; import org.springframework.stereotype.Component; @@ -52,7 +52,7 @@ public class EnrollmentSupplier extends AbstractPreheatSupplier { @Nonnull private final ProgramStore programStore; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List programsWithoutRegistration = preheat.getAll(Program.class).stream() .filter(program -> program.getProgramType().equals(ProgramType.WITHOUT_REGISTRATION)) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java index 4a0190c49171..f3981a09d4d5 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java @@ -33,7 +33,7 @@ import java.util.stream.Collectors; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.program.Enrollment; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -64,7 +64,7 @@ protected EnrollmentsWithAtLeastOneEventSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { final Map enrollments = preheat.getEnrollments(); List programStageIds = enrollments.values().stream().map(IdentifiableObject::getId).collect(Collectors.toList()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java index 2409d9c2a61d..8d3ce4dd9221 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java @@ -40,9 +40,9 @@ import org.hisp.dhis.category.CategoryService; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.CategoryOptionComboMapper; import org.springframework.stereotype.Component; @@ -63,10 +63,10 @@ public class EventCategoryOptionComboSupplier extends AbstractPreheatSupplier { @Nonnull private final CategoryService categoryService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List>> events = - params.getEvents().stream() + trackerObjects.getEvents().stream() .filter( e -> e.getAttributeOptionCombo().isBlank() diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java index bdf845453377..fa1a2128754d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java @@ -31,8 +31,8 @@ import java.util.Objects; import java.util.stream.Collectors; import org.hisp.dhis.program.ProgramStage; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; @@ -72,13 +72,13 @@ protected EventProgramStageMapSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { - if (params.getEvents().isEmpty()) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + if (trackerObjects.getEvents().isEmpty()) { return; } List notRepeatableProgramStageUids = - params.getEvents().stream() + trackerObjects.getEvents().stream() .map(Event::getProgramStage) .filter(Objects::nonNull) .map(preheat::getProgramStage) @@ -90,7 +90,7 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { .collect(Collectors.toList()); List enrollmentUids = - params.getEvents().stream() + trackerObjects.getEvents().stream() .map(Event::getEnrollment) .filter(Objects::nonNull) .distinct() diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java index 6a0cc39b88cd..186716c87d47 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java @@ -39,10 +39,10 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.stereotype.Component; @@ -55,9 +55,8 @@ public class FileResourceSupplier extends AbstractPreheatSupplier { @Nonnull private final FileResourceService fileResourceService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { - TrackerIdSchemeParams idSchemes = params.getIdSchemes(); - + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + TrackerIdSchemeParams idSchemes = preheat.getIdSchemes(); List fileResourceAttributes = preheat.getAll(TrackedEntityAttribute.class).stream() .filter(at -> at.getValueType().isFile()) @@ -71,15 +70,15 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { .collect(Collectors.toList()); List fileResourceIds = new ArrayList<>(); - params + trackerObjects .getTrackedEntities() .forEach( te -> collectResourceIds(fileResourceAttributes, fileResourceIds, te.getAttributes())); - params + trackerObjects .getEnrollments() .forEach( en -> collectResourceIds(fileResourceAttributes, fileResourceIds, en.getAttributes())); - params + trackerObjects .getEvents() .forEach( en -> diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java index ef817a04a2da..9918e4f6bdf6 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java @@ -41,10 +41,10 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.stereotype.Component; @@ -57,7 +57,7 @@ public class OrgUnitValueTypeSupplier extends AbstractPreheatSupplier { @Nonnull private final IdentifiableObjectManager manager; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { TrackerIdSchemeParams idSchemes = preheat.getIdSchemes(); List orgUnitAttributes = @@ -73,13 +73,13 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { .collect(Collectors.toList()); List orgUnitIds = new ArrayList<>(); - params + trackerObjects .getTrackedEntities() .forEach(te -> collectResourceIds(orgUnitAttributes, orgUnitIds, te.getAttributes())); - params + trackerObjects .getEnrollments() .forEach(en -> collectResourceIds(orgUnitAttributes, orgUnitIds, en.getAttributes())); - params + trackerObjects .getEvents() .forEach(ev -> collectResourceIds(orgUnitDataElements, orgUnitIds, ev.getDataValues())); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java index a9d832164f76..94ae63808d93 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java @@ -35,7 +35,7 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodStore; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; import org.springframework.stereotype.Component; @@ -51,7 +51,7 @@ public class PeriodTypeSupplier extends AbstractPreheatSupplier { @Nonnull private final PreheatCacheService cache; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { if (cache.hasKey(Period.class.getName())) { preheat.put(TrackerIdSchemeParam.UID, cache.getAll(Period.class.getName())); } else { diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java index f57986b87bad..231addb5deb3 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.preheat.supplier; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; /** @@ -39,8 +40,8 @@ public interface PreheatSupplier { /** * Adds data to the {@link TrackerPreheat} using the supplied {@link TrackerImportParams} * - * @param params {@link TrackerImportParams} + * @param trackerObjects {@link TrackerObjects} * @param preheat {@link TrackerPreheat} */ - void add(TrackerImportParams params, TrackerPreheat preheat); + void add(TrackerObjects trackerObjects, TrackerPreheat preheat); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java index e44c6459bf5b..ee4b26b85a5b 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java @@ -31,7 +31,7 @@ import java.util.stream.Collectors; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -55,7 +55,7 @@ protected ProgramOrgUnitsSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { // fetch all existing Org Units from payload final List orgUnitIds = preheat.getAll(OrganisationUnit.class).stream() diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java index 7dcd04847c3f..87c909951e01 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java @@ -38,8 +38,8 @@ import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityProgramOwnerOrgUnit; import org.hisp.dhis.trackedentity.TrackedEntityProgramOwnerStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.OrganisationUnitMapper; import org.springframework.stereotype.Component; @@ -53,18 +53,18 @@ public class ProgramOwnerSupplier extends AbstractPreheatSupplier { @Nonnull private final TrackedEntityProgramOwnerStore trackedEntityProgramOwnerStore; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { final Map preheatedTrackedEntities = preheat.getTrackedEntities(); final Map preheatedEnrollments = preheat.getEnrollments(); Set teIds = new HashSet<>(); - for (org.hisp.dhis.tracker.imports.domain.Enrollment en : params.getEnrollments()) { + for (org.hisp.dhis.tracker.imports.domain.Enrollment en : trackerObjects.getEnrollments()) { TrackedEntity te = preheatedTrackedEntities.get(en.getTrackedEntity()); if (te != null) { teIds.add(te.getId()); } } - for (Event ev : params.getEvents()) { + for (Event ev : trackerObjects.getEvents()) { Enrollment enrollment = preheatedEnrollments.get(ev.getEnrollment()); if (enrollment != null && enrollment.getTrackedEntity() != null) { teIds.add(enrollment.getTrackedEntity().getId()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java index 3b075fed7f1e..9072523a59e1 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java @@ -37,7 +37,7 @@ import org.hisp.dhis.program.Enrollment; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStatus; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.util.Constant; import org.springframework.jdbc.core.JdbcTemplate; @@ -97,9 +97,9 @@ protected TrackedEntityEnrollmentSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List trackedEntityList = - params.getEnrollments().stream() + trackerObjects.getEnrollments().stream() .map(org.hisp.dhis.tracker.imports.domain.Enrollment::getTrackedEntity) .collect(Collectors.toList()); @@ -115,7 +115,7 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { Map> trackedEntityToEnrollmentMap = new HashMap<>(); - if (params.getEnrollments().isEmpty()) return; + if (trackerObjects.getEnrollments().isEmpty()) return; for (List trackedEntityListSubList : trackedEntities) { queryTeiAndAddToMap(trackedEntityToEnrollmentMap, trackedEntityListSubList, programList); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java index 598a38bc0d74..353bb1888b91 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java @@ -52,9 +52,9 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.UniqueAttributeValue; import org.springframework.stereotype.Component; @@ -74,20 +74,20 @@ public class UniqueAttributesSupplier extends AbstractPreheatSupplier { @Nonnull private final TrackedEntityAttributeValueService trackedEntityAttributeValueService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List uniqueTrackedEntityAttributes = trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes(); Map> allUniqueAttributesByTrackedEntity = - getAllAttributesByTrackedEntity(params, preheat, uniqueTrackedEntityAttributes); + getAllAttributesByTrackedEntity(trackerObjects, preheat, uniqueTrackedEntityAttributes); List uniqueAttributeValuesFromPayload = getDuplicatedUniqueValuesInPayload(allUniqueAttributesByTrackedEntity); List uniqueAttributeValuesFromDB = getAlreadyPresentInDbUniqueValues( - params.getIdSchemes(), + preheat.getIdSchemes(), allUniqueAttributesByTrackedEntity, uniqueTrackedEntityAttributes); @@ -102,11 +102,11 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { private Map> getAllAttributesByTrackedEntity( - TrackerImportParams params, + TrackerObjects trackerObjects, TrackerPreheat preheat, List uniqueTrackedEntityAttributes) { Map> teUniqueAttributes = - params.getTrackedEntities().stream() + trackerObjects.getTrackedEntities().stream() .collect( toMap( Function.identity(), @@ -115,9 +115,10 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { Map> enrollmentUniqueAttributes = - params.getEnrollments().stream() + trackerObjects.getEnrollments().stream() .collect( - groupingBy(e -> getEntityForEnrollment(params, preheat, e.getTrackedEntity()))) + groupingBy( + e -> getEntityForEnrollment(trackerObjects, preheat, e.getTrackedEntity()))) .entrySet() .stream() .collect( @@ -136,12 +137,12 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { } private org.hisp.dhis.tracker.imports.domain.TrackedEntity getEntityForEnrollment( - TrackerImportParams params, TrackerPreheat preheat, String teUid) { + TrackerObjects trackerObjects, TrackerPreheat preheat, String teUid) { TrackedEntity trackedEntity = preheat.getTrackedEntity(teUid); // Get te from Preheat Optional optionalTe = - params.getTrackedEntities().stream() + trackerObjects.getTrackedEntities().stream() .filter(te -> Objects.equals(te.getTrackedEntity(), teUid)) .findAny(); if (optionalTe.isPresent()) { @@ -152,7 +153,7 @@ private org.hisp.dhis.tracker.imports.domain.TrackedEntity getEntityForEnrollmen new org.hisp.dhis.tracker.imports.domain.TrackedEntity(); te.setTrackedEntity(teUid); te.setOrgUnit( - params.getIdSchemes().toMetadataIdentifier(trackedEntity.getOrganisationUnit())); + preheat.getIdSchemes().toMetadataIdentifier(trackedEntity.getOrganisationUnit())); return te; } else // TE is not present. but we do not fail here. // A validation error will be thrown in validation phase diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java index 0f119ea5a100..ff98ac18a259 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java @@ -37,8 +37,8 @@ import org.apache.commons.lang3.StringUtils; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.domain.User; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.UserMapper; @@ -56,9 +56,9 @@ public class UserSupplier extends AbstractPreheatSupplier { @Nonnull private final UserService userService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { Set userUids = - params.getEvents().stream() + trackerObjects.getEvents().stream() .filter(Objects::nonNull) .map(Event::getAssignedUser) .filter(Objects::nonNull) @@ -67,7 +67,7 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { .collect(Collectors.toSet()); Set usernames = - params.getEvents().stream() + trackerObjects.getEvents().stream() .filter(Objects::nonNull) .map(Event::getAssignedUser) .filter(Objects::nonNull) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java index 0702e56f7c44..a2523c34631c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java @@ -37,9 +37,9 @@ import org.hisp.dhis.common.ValueType; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.UserMapper; import org.hisp.dhis.user.User; @@ -56,7 +56,7 @@ public class UsernameValueTypeSupplier extends AbstractPreheatSupplier { @Nonnull private final UserService userService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List attributes = preheat.getAll(TrackedEntityAttribute.class); TrackerIdSchemeParams idSchemes = preheat.getIdSchemes(); @@ -68,10 +68,10 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { List usernames = new ArrayList<>(); - params + trackerObjects .getTrackedEntities() .forEach(te -> collectResourceIds(usernameAttributes, usernames, te.getAttributes())); - params + trackerObjects .getEnrollments() .forEach(en -> collectResourceIds(usernameAttributes, usernames, en.getAttributes())); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java index da4e957a096e..b33812b83b40 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java @@ -44,7 +44,6 @@ import org.hisp.dhis.schema.SchemaService; import org.hisp.dhis.tracker.imports.TrackerIdScheme; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; import org.hisp.dhis.tracker.imports.preheat.mappers.CopyMapper; @@ -79,9 +78,8 @@ protected AbstractSchemaStrategy( } @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { - TrackerIdSchemeParam idSchemeParam = params.getIdSchemes().getByClass(getSchemaClass()); + public void add(List> splitList, TrackerPreheat preheat) { + TrackerIdSchemeParam idSchemeParam = preheat.getIdSchemes().getByClass(getSchemaClass()); Schema schema = schemaService.getDynamicSchema(getSchemaClass()); queryForIdentifiableObjects(preheat, schema, idSchemeParam, splitList, mapper()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java index 3bdff20cc475..9b6811151a03 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java @@ -28,12 +28,11 @@ package org.hisp.dhis.tracker.imports.preheat.supplier.strategy; import java.util.List; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; /** * @author Luciano Fiandesio */ public interface ClassBasedSupplierStrategy { - void add(TrackerImportParams params, List> splitList, TrackerPreheat preheat); + void add(List> splitList, TrackerPreheat preheat); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java index 2875cba5ee7d..03e8ea052440 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java @@ -32,7 +32,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.program.Enrollment; import org.hisp.dhis.program.EnrollmentStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.EnrollmentMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -50,8 +49,7 @@ public class EnrollmentStrategy implements ClassBasedSupplierStrategy { @Nonnull private final EnrollmentStore enrollmentStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { for (List ids : splitList) { List enrollments = enrollmentStore.getIncludingDeleted(ids); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java index 5148447256d4..aceb75b5833d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java @@ -32,7 +32,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.program.Event; import org.hisp.dhis.program.EventStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.EventMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -48,8 +47,7 @@ public class EventStrategy implements ClassBasedSupplierStrategy { @Nonnull private final EventStore eventStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { for (List ids : splitList) { List events = eventStore.getIncludingDeleted(ids); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java index f0d7f3d971db..0b6fdcd25595 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java @@ -32,7 +32,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.note.Note; import org.hisp.dhis.note.NoteStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.NoteMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -48,8 +47,7 @@ public class NoteStrategy implements ClassBasedSupplierStrategy { @Nonnull private final NoteStore noteStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { splitList.forEach( ids -> preheat.putNotes( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java index 20902c26b09f..b44a38149515 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java @@ -33,7 +33,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.relationship.RelationshipStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Relationship; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.RelationshipMapper; @@ -50,8 +49,7 @@ public class RelationshipStrategy implements ClassBasedSupplierStrategy { @Nonnull private final RelationshipStore relationshipStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { List relationships = retrieveRelationships(splitList); preheat.putRelationships( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java index 27f29f913215..182f8645c2cc 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java @@ -32,7 +32,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.TrackedEntityMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -50,8 +49,7 @@ public class TrackerEntityStrategy implements ClassBasedSupplierStrategy { @Nonnull private TrackedEntityStore trackedEntityStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { for (List ids : splitList) { // Fetch all Tracked Entity present in the payload List trackedEntities = trackedEntityStore.getIncludingDeleted(ids); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java index d9545c36e13a..15670984a5de 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java @@ -75,9 +75,6 @@ public class ImportReport { */ @JsonProperty Stats stats; - /** A report object containing the elapsed time for each Import stage */ - @JsonProperty TimingsStats timingsStats; - /** A report containing the outcome of the commit stage (e.g. how many entities were persisted) */ @JsonProperty("bundleReport") PersistenceReport persistenceReport; @@ -96,15 +93,13 @@ public class ImportReport { * therefore all bundle objects were ignored. * * @param validationReport The validation report - * @param timingsStats The timing stats * @param bundleSize The sum of all bundle objects */ public static ImportReport withValidationErrors( - ValidationReport validationReport, TimingsStats timingsStats, int bundleSize) { + ValidationReport validationReport, int bundleSize) { return builder() .status(Status.ERROR) .validationReport(validationReport) - .timingsStats(timingsStats) .stats(Stats.builder().ignored(bundleSize).build()) .build(); } @@ -119,15 +114,12 @@ public static ImportReport withValidationErrors( * * @param message The error message * @param validationReport The validation report if available - * @param timingsStats The timing stats if available */ - public static ImportReport withError( - String message, ValidationReport validationReport, TimingsStats timingsStats) { + public static ImportReport withError(String message, ValidationReport validationReport) { // TODO shall we calculate stats in this case? return builder() .status(Status.ERROR) .validationReport(validationReport) - .timingsStats(timingsStats) .message(message) .build(); } @@ -142,7 +134,6 @@ public static ImportReport withError( * @param persistenceReport The report containing how many bundle objects were successfully * persisted * @param validationReport The validation report if available - * @param timingsStats The timing stats if available * @param bundleSize a map containing the size of each entity type in the Bundle - before the * validation */ @@ -150,7 +141,6 @@ public static ImportReport withImportCompleted( Status status, PersistenceReport persistenceReport, ValidationReport validationReport, - TimingsStats timingsStats, Map bundleSize) { Stats stats = Stats.builder().build(); Stats brs = persistenceReport.getStats(); @@ -159,7 +149,6 @@ public static ImportReport withImportCompleted( return builder() .status(status) .validationReport(validationReport) - .timingsStats(timingsStats) .persistenceReport(processBundleReport(persistenceReport, bundleSize)) .stats(stats) .build(); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java deleted file mode 100644 index 594ac149f333..000000000000 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.tracker.imports.report; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.function.Supplier; -import lombok.Data; -import org.hisp.dhis.commons.timer.SystemTimer; -import org.hisp.dhis.commons.timer.Timer; - -/** - * This report keeps track of the elapsed time for each stage of the validation process. - * - * @author Luciano Fiandesio - */ -@Data -public class TimingsStats { - public static final String PREHEAT_OPS = "preheat"; - - public static final String PREPROCESS_OPS = "preprocess"; - - public static final String COMMIT_OPS = "commit"; - - public static final String VALIDATION_OPS = "validation"; - - public static final String PROGRAMRULE_OPS = "programrule"; - - public static final String VALIDATE_PROGRAMRULE_OPS = "programruleValidation"; - - public static final String TOTAL_OPS = "totalImport"; - - public static final String PREPARE_REQUEST_OPS = "prepareRequest"; - - public static final String TOTAL_REQUEST_OPS = "totalRequest"; - - @JsonProperty private Map timers = new LinkedHashMap<>(); - - private static final String DEFAULT_VALUE = "0.0 sec."; - - public String getPrepareRequest() { - return timers.getOrDefault(PREPARE_REQUEST_OPS, DEFAULT_VALUE); - } - - public String getValidation() { - return timers.getOrDefault(VALIDATION_OPS, DEFAULT_VALUE); - } - - public String getCommit() { - return timers.getOrDefault(COMMIT_OPS, DEFAULT_VALUE); - } - - public String getPreheat() { - return timers.getOrDefault(PREHEAT_OPS, DEFAULT_VALUE); - } - - public String getProgramRule() { - return timers.getOrDefault(PROGRAMRULE_OPS, DEFAULT_VALUE); - } - - public String getTotalImport() { - return timers.getOrDefault(TOTAL_OPS, DEFAULT_VALUE); - } - - public String getTotalRequest() { - - return timers.getOrDefault(TOTAL_REQUEST_OPS, DEFAULT_VALUE); - } - - @JsonIgnore private Timer totalTimer; - - public TimingsStats() { - totalTimer = new SystemTimer().start(); - } - - public void set(String timedOperation, String elapsed) { - this.timers.put(timedOperation, elapsed); - } - - /** - * Executes the given Supplier and measure the elapsed time. - * - * @param timedOperation the operation name to place in the timers map - * @param supplier ths Supplier to execute - * @return the result of the Supplier invocation - */ - public T exec(String timedOperation, Supplier supplier) { - Timer timer = new SystemTimer().start(); - - T result = supplier.get(); - - timer.stop(); - - this.set(timedOperation, timer.toString()); - - return result; - } - - /** - * Executes the given operation. - * - * @param timedOperation the operation name to place in the timers map - * @param runnable the operation to execute - */ - public void execVoid(String timedOperation, Runnable runnable) { - Timer timer = new SystemTimer().start(); - - runnable.run(); - - timer.stop(); - - this.set(timedOperation, timer.toString()); - } - - public TimingsStats stopTimer() { - if (totalTimer != null) { - totalTimer.stop(); - this.timers.put(TOTAL_OPS, totalTimer.toString()); - } - return this; - } - - public String get(String validationOps) { - return this.timers.getOrDefault(validationOps, DEFAULT_VALUE); - } -} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java index 89a605f721e1..8fe3e1309cb0 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java @@ -65,6 +65,7 @@ import org.hisp.dhis.tracker.imports.domain.Relationship; import org.hisp.dhis.tracker.imports.domain.RelationshipItem; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -81,13 +82,6 @@ void setUp() { @Test void collectTrackedEntities() { - - TrackerIdSchemeParams idSchemes = - TrackerIdSchemeParams.builder() - .idScheme(TrackerIdSchemeParam.ofAttribute("NTVsGflP5Ix")) - .orgUnitIdScheme(TrackerIdSchemeParam.NAME) - .build(); - TrackedEntity trackedEntity = TrackedEntity.builder() .trackedEntity(uid()) @@ -96,10 +90,10 @@ void collectTrackedEntities() { .attributes(teAttributes("VohJnvWfvyo", "qv9xOw8fBzy")) .build(); - TrackerImportParams params = - params(idSchemes).trackedEntities(singletonList(trackedEntity)).build(); + TrackerObjects trackerObjects = + TrackerObjects.builder().trackedEntities(singletonList(trackedEntity)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertContainsOnly(Set.of(trackedEntity.getTrackedEntity()), ids.get(TrackedEntity.class)); @@ -110,13 +104,6 @@ void collectTrackedEntities() { @Test void collectEnrollments() { - - TrackerIdSchemeParams idSchemes = - TrackerIdSchemeParams.builder() - .orgUnitIdScheme(TrackerIdSchemeParam.NAME) - .programIdScheme(TrackerIdSchemeParam.ofAttribute("NTVsGflP5Ix")) - .build(); - Enrollment enrollment = Enrollment.builder() .enrollment(uid()) @@ -126,9 +113,10 @@ void collectEnrollments() { .attributes(teAttributes("VohJnvWfvyo", "qv9xOw8fBzy")) .build(); - TrackerImportParams params = params(idSchemes).enrollments(singletonList(enrollment)).build(); + TrackerObjects trackerObjects = + TrackerObjects.builder().enrollments(singletonList(enrollment)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertContainsOnly(Set.of(enrollment.getUid()), ids.get(Enrollment.class)); @@ -162,9 +150,9 @@ void collectEvents() { .notes(List.of(Note.builder().note("i1vviSlidJE").value("nice day!").build())) .build(); - TrackerImportParams params = params(idSchemes).events(singletonList(event)).build(); + TrackerObjects trackerObjects = TrackerObjects.builder().events(singletonList(event)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertContainsOnly(Set.of(event.getUid()), ids.get(Event.class)); @@ -182,10 +170,9 @@ void collectEvents() { void collectEventsSkipsNotesWithoutAnId() { Event event = Event.builder().notes(List.of(Note.builder().value("nice day!").build())).build(); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()).events(singletonList(event)).build(); + TrackerObjects trackerObjects = TrackerObjects.builder().events(singletonList(event)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertNull(ids.get(org.hisp.dhis.note.Note.class)); @@ -196,10 +183,9 @@ void collectEventsSkipsNotesWithoutAValue() { Event event = Event.builder().notes(List.of(Note.builder().note("i1vviSlidJE").build())).build(); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()).events(singletonList(event)).build(); + TrackerObjects trackerObjects = TrackerObjects.builder().events(singletonList(event)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertNull(ids.get(org.hisp.dhis.note.Note.class)); @@ -222,10 +208,10 @@ void collectRelationships() { .to(RelationshipItem.builder().event(uid()).build()) .build(); - TrackerImportParams params = - params(idSchemes).relationships(singletonList(relationship)).build(); + TrackerObjects trackerObjects = + TrackerObjects.builder().relationships(singletonList(relationship)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertContainsOnly(Set.of(relationship.getRelationship()), ids.get(Relationship.class)); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java index d1b6c5948c67..dc32d1c6c9f0 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java @@ -39,12 +39,14 @@ import java.util.List; import java.util.stream.Collectors; import org.hisp.dhis.random.BeanRandomizer; +import org.hisp.dhis.scheduling.NoopJobProgress; import org.hisp.dhis.system.notification.Notifier; import org.hisp.dhis.tracker.imports.DefaultTrackerImportService; import org.hisp.dhis.tracker.imports.ParamsConverter; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerUserService; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preprocess.TrackerPreprocessService; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.validation.ValidationResult; @@ -78,27 +80,26 @@ class TrackerImporterServiceTest { private TrackerImportParams params = null; + private TrackerObjects trackerObjects; + private final BeanRandomizer rnd = BeanRandomizer.create(); @BeforeEach public void setUp() { subject = new DefaultTrackerImportService( - trackerBundleService, - validationService, - trackerPreprocessService, - trackerUserService, - notifier); + trackerBundleService, validationService, trackerPreprocessService, trackerUserService); final List events = rnd.objects(Event.class, 3).collect(Collectors.toList()); - params = - TrackerImportParams.builder() + params = TrackerImportParams.builder().userId("123").build(); + + trackerObjects = + TrackerObjects.builder() .events(events) .enrollments(new ArrayList<>()) .relationships(new ArrayList<>()) .trackedEntities(new ArrayList<>()) - .userId("123") .build(); PersistenceReport persistenceReport = PersistenceReport.emptyReport(); @@ -110,25 +111,26 @@ public void setUp() { when(validationService.validateRuleEngine(any(TrackerBundle.class))) .thenReturn(validationResult); when(trackerPreprocessService.preprocess(any(TrackerBundle.class))) - .thenReturn(ParamsConverter.convert(params)); + .thenReturn(ParamsConverter.convert(params, trackerObjects, new User())); } @Test void testSkipSideEffect() { TrackerImportParams parameters = - TrackerImportParams.builder() - .events(params.getEvents()) + TrackerImportParams.builder().skipSideEffects(true).userId("123").build(); + + TrackerObjects objects = + TrackerObjects.builder() + .events(trackerObjects.getEvents()) .enrollments(new ArrayList<>()) .relationships(new ArrayList<>()) .trackedEntities(new ArrayList<>()) - .skipSideEffects(true) - .userId("123") .build(); - when(trackerBundleService.create(any(TrackerImportParams.class))) - .thenReturn(ParamsConverter.convert(parameters)); + when(trackerBundleService.create(any(TrackerImportParams.class), any(), any())) + .thenReturn(ParamsConverter.convert(parameters, objects, new User())); - subject.importTracker(parameters); + subject.importTracker(parameters, trackerObjects, NoopJobProgress.INSTANCE); verify(trackerBundleService, times(0)).handleTrackerSideEffects(anyList()); } @@ -138,10 +140,10 @@ void testWithSideEffects() { doAnswer(invocationOnMock -> null) .when(trackerBundleService) .handleTrackerSideEffects(anyList()); - when(trackerBundleService.create(any(TrackerImportParams.class))) - .thenReturn(ParamsConverter.convert(params)); + when(trackerBundleService.create(any(TrackerImportParams.class), any(), any())) + .thenReturn(ParamsConverter.convert(params, trackerObjects, new User())); - subject.importTracker(params); + subject.importTracker(params, trackerObjects, NoopJobProgress.INSTANCE); verify(trackerBundleService, times(1)).handleTrackerSideEffects(anyList()); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java index 7b317272e009..84455dbeba55 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java @@ -37,8 +37,9 @@ import java.util.Collections; import java.util.List; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.supplier.ClassBasedSupplier; import org.hisp.dhis.tracker.imports.preheat.supplier.PreheatSupplier; import org.hisp.dhis.user.User; @@ -72,12 +73,13 @@ class DefaultTrackerPreheatServiceTest { private DefaultTrackerPreheatService preheatService; - private final TrackerImportParams preheatParams = - TrackerImportParams.builder() - .user(getUser()) + private final TrackerObjects preheatParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(new TrackedEntity())) .build(); + private final TrackerIdSchemeParams idSchemeParams = TrackerIdSchemeParams.builder().build(); + @BeforeEach public void setUp() { preheatService = @@ -95,7 +97,7 @@ void shouldGetFromContextAndAdd() { doCallRealMethod().when(classBasedSupplier).add(any(), any()); - preheatService.preheat(preheatParams); + preheatService.preheat(preheatParams, idSchemeParams, getUser()); verify(applicationContext).getBean(bean.getValue(), preheatSupplierClassCaptor.getValue()); verify(classBasedSupplier).add(any(), any()); @@ -107,7 +109,7 @@ void shouldDoNothingWhenSupplierBeanNotFound() { when(applicationContext.getBean(bean.capture(), preheatSupplierClassCaptor.capture())) .thenThrow(new BeanCreationException("e")); - preheatService.preheat(preheatParams); + preheatService.preheat(preheatParams, idSchemeParams, getUser()); verify(applicationContext).getBean(bean.getValue(), preheatSupplierClassCaptor.getValue()); verify(classBasedSupplier, times(0)).add(any(), any()); @@ -120,7 +122,7 @@ void shouldDoNothingWhenAddException() { .thenReturn(classBasedSupplier); doThrow(new RuntimeException("e")).when(classBasedSupplier).add(any(), any()); - preheatService.preheat(preheatParams); + preheatService.preheat(preheatParams, idSchemeParams, getUser()); verify(applicationContext).getBean(bean.getValue(), preheatSupplierClassCaptor.getValue()); verify(classBasedSupplier).add(any(), any()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java index 3f0afe9218d1..e1b10b5a4f5f 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java @@ -36,8 +36,8 @@ import java.util.HashMap; import java.util.HashSet; import org.hisp.dhis.tracker.imports.TrackerIdentifierCollector; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.ClassBasedSupplierStrategy; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.GenericStrategy; @@ -63,7 +63,7 @@ class ClassBasedSupplierTest { @Mock private GenericStrategy genericStrategy; - @Mock private TrackerImportParams trackerImportParams; + @Mock private TrackerObjects trackerObjects; @Mock private TrackerEntityStrategy trackerEntityStrategy; @@ -74,7 +74,7 @@ public void setUp() { classBasedSupplier = new ClassBasedSupplier(identifierCollector, strategiesMap); classBasedSupplier.setApplicationContext(applicationContext); - when(identifierCollector.collect(trackerImportParams)) + when(identifierCollector.collect(trackerObjects)) .thenReturn( new HashMap<>() { { @@ -91,7 +91,7 @@ void verifyGenericStrategy() { when(applicationContext.getBean(Constant.GENERIC_STRATEGY_BEAN, GenericStrategy.class)) .thenReturn(genericStrategy); - classBasedSupplier.preheatAdd(trackerImportParams, new TrackerPreheat()); + classBasedSupplier.preheatAdd(trackerObjects, new TrackerPreheat()); verify(applicationContext).getBean(Constant.GENERIC_STRATEGY_BEAN, GenericStrategy.class); } @@ -102,7 +102,7 @@ void verifyClassBasedSupplierStrategy() { when(applicationContext.getBean(anyString(), eq(ClassBasedSupplierStrategy.class))) .thenReturn(trackerEntityStrategy); - classBasedSupplier.preheatAdd(trackerImportParams, new TrackerPreheat()); + classBasedSupplier.preheatAdd(trackerObjects, new TrackerPreheat()); verify(applicationContext).getBean("classbasedstrategy", ClassBasedSupplierStrategy.class); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java index f9fada079f06..6f2e07b02199 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java @@ -39,9 +39,9 @@ import org.hisp.dhis.relationship.RelationshipType; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.RelationshipItem; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -148,12 +148,12 @@ void verifySupplier() { when(relationshipStore.getByUid(List.of(REL_A_UID, REL_B_UID))) .thenReturn(List.of(relationshipA(), relationshipB())); - TrackerImportParams trackerImportParams = - TrackerImportParams.builder() + TrackerObjects trackerObjects = + TrackerObjects.builder() .relationships(List.of(relationshipA, relationshipB, relationshipC)) .build(); - supplier.preheatAdd(trackerImportParams, preheat); + supplier.preheatAdd(trackerObjects, preheat); assertTrue(preheat.isDuplicate(relationshipA)); assertFalse(preheat.isDuplicate(invertTeToTeRelationship(relationshipA))); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java index b04efa42457a..e10fbf54cbd2 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java @@ -43,7 +43,7 @@ import org.hisp.dhis.program.ProgramStore; import org.hisp.dhis.random.BeanRandomizer; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -73,7 +73,7 @@ class EnrollmentSupplierTest extends DhisConvenienceTest { private Program programWithoutRegistration; - private TrackerImportParams params; + private TrackerObjects params; private final BeanRandomizer rnd = BeanRandomizer.create(); @@ -100,7 +100,7 @@ public void setUp() { when(enrollmentStore.getByPrograms(Lists.newArrayList(programWithoutRegistration))) .thenReturn(enrollments); - params = TrackerImportParams.builder().build(); + params = TrackerObjects.builder().build(); preheat = new TrackerPreheat(); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java index 2274ae89f00e..a251928a66b0 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java @@ -52,9 +52,9 @@ import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -97,10 +97,10 @@ void shouldPreheatEventAOCIfNotProvided() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); when(preheat.getProgram(event.getProgram())).thenReturn(program); + when(preheat.getIdSchemes()).thenReturn(identifierParams); options.forEach( o -> when(preheat.getCategoryOption(identifierParams.toMetadataIdentifier(o))) @@ -142,9 +142,9 @@ void shouldPreheatEventAOCIfNotProvidedAndEventHasProgramStageButNoProgram() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgramStage(event.getProgramStage())).thenReturn(stage); options.forEach( o -> @@ -183,9 +183,9 @@ void shouldPreheatEventAOCIfNotProvidedOnlyIfNotAlreadyFetched() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event, event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); options.forEach( o -> @@ -228,9 +228,9 @@ void shouldPreheatEventAOCEvenIfNotFound() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event, event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); options.forEach( o -> @@ -271,9 +271,9 @@ void shouldNotPreheatEventAOCIfNotProvidedAndCONotFound() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); when(categoryService.getCategoryOptionCombo(categoryCombo, aoc.getCategoryOptions())) .thenReturn(aoc); @@ -304,8 +304,9 @@ void shouldNotPreheatEventAOCIfEventHasNoProgram() { .programStage(MetadataIdentifier.EMPTY_UID) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + + when(preheat.getIdSchemes()).thenReturn(identifierParams); supplier.preheatAdd(params, preheat); @@ -335,8 +336,9 @@ void shouldNotPreheatEventAOCIfEventHasNoProgramAndNoProgramStage() { .programStage(MetadataIdentifier.EMPTY_UID) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + + when(preheat.getIdSchemes()).thenReturn(identifierParams); options.forEach( o -> @@ -374,9 +376,9 @@ void shouldNotPreheatEventAOCIfEventHasNoProgramAndItsProgramStageHasNoProgram() .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgramStage(event.getProgramStage())).thenReturn(stage); options.forEach( o -> @@ -412,9 +414,9 @@ void shouldNotPreheatEventAOCIfAOCAndCOsAreProvided() { .attributeOptionCombo(identifierParams.toMetadataIdentifier(aoc)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); supplier.preheatAdd(params, preheat); @@ -443,9 +445,9 @@ void shouldNotPreheatEventAOCIfAOCIsProvided() { .attributeOptionCombo(identifierParams.toMetadataIdentifier(aoc)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); supplier.preheatAdd(params, preheat); @@ -474,9 +476,9 @@ void shouldNotPreheatEventAOCIfNoCategoryOptionsProvided() { .attributeOptionCombo(identifierParams.toMetadataIdentifier((CategoryOptionCombo) null)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); supplier.preheatAdd(params, preheat); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java index d5a67a2cb66e..e34306bd2eeb 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java @@ -43,14 +43,13 @@ import org.hisp.dhis.fileresource.FileResourceService; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -86,8 +85,8 @@ void testSupplierAddsFileResourcesReferencedByTeAttributes() { when(fileResourceService.getFileResources(List.of("kKacJUdANDC"))) .thenReturn(List.of(fileResource)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .trackedEntities( List.of( trackedEntity(numericAttribute(), fileAttribute("hQKI6KcEu5t", "kKacJUdANDC")))) @@ -102,8 +101,8 @@ void testSupplierAddsFileResourcesReferencedByTeAttributes() { void testSupplierDoesNotAddFileResourceIfTeAttributeValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(teaFileResource("hQKI6KcEu5t"))); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .trackedEntities(List.of(trackedEntity(fileAttribute("hQKI6KcEu5t", "")))) .build(); @@ -122,8 +121,8 @@ void testSupplierAddsFileResourcesReferencedByEnrollmentAttributes() { when(fileResourceService.getFileResources(List.of("kKacJUdANDC"))) .thenReturn(List.of(fileResource)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .enrollments( List.of( enrollment(numericAttribute(), fileAttribute("hQKI6KcEu5t", "kKacJUdANDC")))) @@ -144,8 +143,8 @@ void testSupplierAddsFileResourcesReferencedByEventDataElement() { when(fileResourceService.getFileResources(List.of("kKacJUdANDC"))) .thenReturn(List.of(fileResource)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .events( List.of(event(dataValue("numeric", "2"), dataValue("hQKI6KcEu5t", "kKacJUdANDC")))) .build(); @@ -159,10 +158,8 @@ void testSupplierAddsFileResourcesReferencedByEventDataElement() { void testSupplierDoesNotAddFileResourceIfEventDataValueValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(fileDataElement("hQKI6KcEu5t"))); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) - .events(List.of(event(dataValue("hQKI6KcEu5t", "")))) - .build(); + TrackerObjects params = + TrackerObjects.builder().events(List.of(event(dataValue("hQKI6KcEu5t", "")))).build(); supplier.preheatAdd(params, preheat); @@ -189,10 +186,6 @@ private FileResource fileResource(String uid) { return fileResource; } - private TrackerImportParams.TrackerImportParamsBuilder params(TrackerIdSchemeParams idSchemes) { - return TrackerImportParams.builder().idSchemes(idSchemes); - } - private Attribute numericAttribute() { return Attribute.builder() .attribute(MetadataIdentifier.ofUid("numeric")) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java index d887a5538c29..9326f0ea7e24 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java @@ -43,14 +43,13 @@ import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -82,8 +81,8 @@ void testSupplierAddsOrgUnitReferencedByTeAttributes() { when(manager.getByUid(OrganisationUnit.class, List.of("kKacJUdANDC"))) .thenReturn(List.of(orgUnit)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .trackedEntities( List.of( trackedEntity( @@ -99,8 +98,8 @@ void testSupplierAddsOrgUnitReferencedByTeAttributes() { void testSupplierDoesNotAddOrgUnitIfTeAttributeValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(teaOrgUnit("hQKI6KcEu5t"))); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .trackedEntities(List.of(trackedEntity(orgUnitAttribute("hQKI6KcEu5t", "")))) .build(); @@ -118,8 +117,8 @@ void testSupplierAddsOrgUnitReferencedByEnrollmentAttributes() { when(manager.getByUid(OrganisationUnit.class, List.of("kKacJUdANDC"))) .thenReturn(List.of(orgUnit)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .enrollments( List.of( enrollment(numericAttribute(), orgUnitAttribute("hQKI6KcEu5t", "kKacJUdANDC")))) @@ -140,8 +139,8 @@ void testSupplierAddsOrgUnitReferencedByEventDataElement() { when(manager.getByUid(OrganisationUnit.class, List.of("kKacJUdANDC"))) .thenReturn(List.of(orgUnit)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .events( List.of(event(dataValue("numeric", "2"), dataValue("hQKI6KcEu5t", "kKacJUdANDC")))) .build(); @@ -155,10 +154,8 @@ void testSupplierAddsOrgUnitReferencedByEventDataElement() { void testSupplierDoesNotAddOrgUnitIfEventDataValueValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(orgUnitDataElement("hQKI6KcEu5t"))); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) - .events(List.of(event(dataValue("hQKI6KcEu5t", "")))) - .build(); + TrackerObjects params = + TrackerObjects.builder().events(List.of(event(dataValue("hQKI6KcEu5t", "")))).build(); supplier.preheatAdd(params, preheat); @@ -185,10 +182,6 @@ private OrganisationUnit orgUnit(String uid) { return orgUnit; } - private TrackerImportParams.TrackerImportParamsBuilder params(TrackerIdSchemeParams idSchemes) { - return TrackerImportParams.builder().idSchemes(idSchemes); - } - private Attribute numericAttribute() { return Attribute.builder() .attribute(MetadataIdentifier.ofUid("numeric")) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java index c2a6cde37893..c9c06a56d47e 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java @@ -36,7 +36,7 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodStore; import org.hisp.dhis.random.BeanRandomizer; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.DefaultPreheatCacheService; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; @@ -70,7 +70,7 @@ void verifySupplier() { final List periods = rnd.objects(Period.class, 20).collect(Collectors.toList()); when(periodStore.getAll()).thenReturn(periods); - final TrackerImportParams params = TrackerImportParams.builder().build(); + final TrackerObjects params = TrackerObjects.builder().build(); TrackerPreheat preheat = new TrackerPreheat(); this.supplier.preheatAdd(params, preheat); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java index 99c86ac1f564..078b526715ac 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java @@ -49,8 +49,8 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttributeService; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -77,7 +77,7 @@ class UniqueAttributeSupplierTest extends DhisConvenienceTest { @Mock private TrackedEntityAttributeValueService trackedEntityAttributeValueService; - private TrackerImportParams params; + private TrackerObjects params; private TrackerPreheat preheat; @@ -91,7 +91,7 @@ class UniqueAttributeSupplierTest extends DhisConvenienceTest { @BeforeEach public void setUp() { - params = TrackerImportParams.builder().build(); + params = TrackerObjects.builder().build(); preheat = new TrackerPreheat(); uniqueAttribute = createTrackedEntityAttribute('A', ValueType.TEXT); OrganisationUnit orgUnit = createOrganisationUnit('A'); @@ -121,8 +121,8 @@ void verifySupplierWhenNoUniqueAttributeIsPresentInTheSystem() { void verifySupplierWhenTeAndEnrollmentHaveTheSameUniqueAttribute() { when(trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes()) .thenReturn(Collections.singletonList(uniqueAttribute)); - TrackerImportParams importParams = - TrackerImportParams.builder() + TrackerObjects importParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(trackedEntity())) .enrollments(Collections.singletonList(enrollment(TE_UID))) .build(); @@ -136,8 +136,8 @@ void verifySupplierWhenTeAndEnrollmentHaveTheSameUniqueAttribute() { void verifySupplierWhenTwoTesHaveAttributeWithSameUniqueValue() { when(trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes()) .thenReturn(Collections.singletonList(uniqueAttribute)); - TrackerImportParams importParams = - TrackerImportParams.builder().trackedEntities(sameUniqueAttributeTrackedEntities()).build(); + TrackerObjects importParams = + TrackerObjects.builder().trackedEntities(sameUniqueAttributeTrackedEntities()).build(); this.supplier.preheatAdd(importParams, preheat); @@ -148,8 +148,8 @@ void verifySupplierWhenTwoTesHaveAttributeWithSameUniqueValue() { void verifySupplierWhenTeAndEnrollmentFromAnotherTeHaveAttributeWithSameUniqueValue() { when(trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes()) .thenReturn(Collections.singletonList(uniqueAttribute)); - TrackerImportParams importParams = - TrackerImportParams.builder() + TrackerObjects importParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(trackedEntity())) .enrollments(Collections.singletonList(enrollment(ANOTHER_TE_UID))) .build(); @@ -169,8 +169,8 @@ void verifySupplierWhenTeinPayloadAndDBHaveTheSameUniqueAttribute() { when(trackedEntityAttributeValueService.getUniqueAttributeByValues( trackedEntityAttributeListMap)) .thenReturn(attributeValues); - TrackerImportParams importParams = - TrackerImportParams.builder() + TrackerObjects importParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(trackedEntity())) .build(); @@ -189,8 +189,8 @@ void verifySupplierWhenTeinPayloadAndAnotherTeInDBHaveTheSameUniqueAttribute() { when(trackedEntityAttributeValueService.getUniqueAttributeByValues( trackedEntityAttributeListMap)) .thenReturn(attributeValues); - TrackerImportParams importParams = - TrackerImportParams.builder() + TrackerObjects importParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(anotherTrackedEntity())) .build(); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java index 40539cd8d544..96c9f3b8ab90 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java @@ -41,8 +41,8 @@ import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.random.BeanRandomizer; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.domain.User; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.user.UserService; @@ -97,7 +97,7 @@ void verifyUserSupplierByUid() { when(manager.getByUid(eq(org.hisp.dhis.user.User.class), argThat(t -> t.containsAll(userIds)))) .thenReturn(users); - final TrackerImportParams params = TrackerImportParams.builder().events(events).build(); + final TrackerObjects params = TrackerObjects.builder().events(events).build(); TrackerPreheat preheat = new TrackerPreheat(); this.supplier.preheatAdd(params, preheat); @@ -117,7 +117,7 @@ void verifyUserSupplierByUsername() { when(userService.getUsersByUsernames(argThat(t -> t.containsAll(usernames)))).thenReturn(users); - final TrackerImportParams params = TrackerImportParams.builder().events(events).build(); + final TrackerObjects params = TrackerObjects.builder().events(events).build(); TrackerPreheat preheat = new TrackerPreheat(); this.supplier.preheatAdd(params, preheat); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java index c312d29bdfd7..679a55664aa9 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java @@ -33,7 +33,6 @@ import java.util.List; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -55,11 +54,6 @@ class TrackerEntityStrategyTest { @Test void verifyStrategyAddRightTeToPreheat() { - final List trackedEntities = - trackedEntities(); - final TrackerImportParams params = - TrackerImportParams.builder().trackedEntities(trackedEntities).build(); - final List uids = List.of("TEIA", "TEIB"); List> splitUids = new ArrayList<>(); @@ -71,7 +65,7 @@ void verifyStrategyAddRightTeToPreheat() { teB.setUid("TEIB"); List dbTrackedEntities = List.of(teA, teB); when(trackedEntityStore.getIncludingDeleted(uids)).thenReturn(dbTrackedEntities); - strategy.add(params, splitUids, preheat); + strategy.add(splitUids, preheat); Mockito.verify(trackedEntityStore).getIncludingDeleted(uids); Mockito.verify(preheat).putTrackedEntities(dbTrackedEntities); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java index ef6e59e58bef..7d031bb72fe9 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java @@ -57,8 +57,6 @@ void testImportCalculatesIgnoredValues() { // Create validation report with 3 objects ValidationReport validationReport = ValidationReport.emptyReport(); validationReport.addErrors(rnd.objects(Error.class, 3).collect(Collectors.toList())); - // Create empty Timing Stats report - TimingsStats timingsStats = new TimingsStats(); // Create payload map Map originalPayload = new HashMap<>(); originalPayload.put(TrackerType.TRACKED_ENTITY, 10); @@ -66,7 +64,7 @@ void testImportCalculatesIgnoredValues() { // Method under test ImportReport rep = ImportReport.withImportCompleted( - Status.OK, persistenceReport, validationReport, timingsStats, originalPayload); + Status.OK, persistenceReport, validationReport, originalPayload); assertThat(rep.getStats().getCreated(), is(8)); assertThat(rep.getStats().getUpdated(), is(6)); assertThat(rep.getStats().getIgnored(), is(3)); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java index 9fac55491548..0ecabc5ed491 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java @@ -28,17 +28,9 @@ package org.hisp.dhis.tracker.imports.report; import static org.hisp.dhis.tracker.TrackerType.TRACKED_ENTITY; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.COMMIT_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREHEAT_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREPARE_REQUEST_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PROGRAMRULE_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.TOTAL_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.TOTAL_REQUEST_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.VALIDATION_OPS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import com.fasterxml.jackson.core.JsonProcessingException; @@ -92,7 +84,6 @@ void testImportReportErrors() { assertNotNull(report.getValidationReport()); assertTrue(report.getValidationReport().hasErrors()); assertFalse(report.getValidationReport().hasWarnings()); - assertNull(report.getTimingsStats()); } @Test @@ -106,7 +97,6 @@ void testImportReportWarnings() { assertNotNull(report.getValidationReport()); assertTrue(report.getValidationReport().hasErrors()); assertTrue(report.getValidationReport().hasWarnings()); - assertNull(report.getTimingsStats()); } @Test @@ -119,12 +109,6 @@ void testImportReportFull() { assertNotNull(report.getValidationReport()); assertTrue(report.getValidationReport().hasErrors()); assertTrue(report.getValidationReport().hasWarnings()); - assertNotNull(report.getTimingsStats()); - assertEquals("1 sec.", report.getTimingsStats().getProgramRule()); - assertEquals("2 sec.", report.getTimingsStats().getCommit()); - assertEquals("3 sec.", report.getTimingsStats().getPreheat()); - assertEquals("4 sec.", report.getTimingsStats().getValidation()); - assertEquals("10 sec.", report.getTimingsStats().getTotalImport()); } @Test @@ -141,15 +125,7 @@ void testSerializingAndDeserializingImportReport() throws JsonProcessingExceptio typeReport.getStats().setDeleted(3); typeReportMap.put(TRACKED_ENTITY, typeReport); PersistenceReport persistenceReport = new PersistenceReport(typeReportMap); - // Build TimingsStats - TimingsStats timingsStats = new TimingsStats(); - timingsStats.set(COMMIT_OPS, "0.1 sec."); - timingsStats.set(PREHEAT_OPS, "0.2 sec."); - timingsStats.set(PROGRAMRULE_OPS, "0.3 sec."); - timingsStats.set(TOTAL_OPS, "0.4 sec."); - timingsStats.set(VALIDATION_OPS, "4 sec."); - timingsStats.set(PREPARE_REQUEST_OPS, "0.5 sec."); - timingsStats.set(TOTAL_REQUEST_OPS, "0.6 sec."); + // Build ValidationReport ValidationReport tvr = ValidationReport.emptyReport(); @@ -171,8 +147,7 @@ void testSerializingAndDeserializingImportReport() throws JsonProcessingExceptio final Map bundleSize = new HashMap<>(); bundleSize.put(TRACKED_ENTITY, 1); ImportReport toSerializeReport = - ImportReport.withImportCompleted( - Status.ERROR, persistenceReport, tvr, timingsStats, bundleSize); + ImportReport.withImportCompleted(Status.ERROR, persistenceReport, tvr, bundleSize); // Serialize TrackerImportReport into String String jsonString = jsonMapper.writeValueAsString(toSerializeReport); // Deserialize the String back into TrackerImportReport @@ -244,28 +219,7 @@ void testSerializingAndDeserializingImportReport() throws JsonProcessingExceptio assertEquals( toSerializeReport.getValidationReport().getWarnings().get(0).getTrackerType(), deserializedReport.getValidationReport().getWarnings().get(0).getTrackerType()); - // Verify TimingsStats - assertEquals( - toSerializeReport.getTimingsStats().getCommit(), - deserializedReport.getTimingsStats().getCommit()); - assertEquals( - toSerializeReport.getTimingsStats().getPreheat(), - deserializedReport.getTimingsStats().getPreheat()); - assertEquals( - toSerializeReport.getTimingsStats().getPrepareRequest(), - deserializedReport.getTimingsStats().getPrepareRequest()); - assertEquals( - toSerializeReport.getTimingsStats().getProgramRule(), - deserializedReport.getTimingsStats().getProgramRule()); - assertEquals( - toSerializeReport.getTimingsStats().getTotalImport(), - deserializedReport.getTimingsStats().getTotalImport()); - assertEquals( - toSerializeReport.getTimingsStats().getTotalRequest(), - deserializedReport.getTimingsStats().getTotalRequest()); - assertEquals( - toSerializeReport.getTimingsStats().getValidation(), - deserializedReport.getTimingsStats().getValidation()); + assertEquals(toSerializeReport.getStats(), deserializedReport.getStats()); } @@ -281,17 +235,7 @@ private ImportReport createImportReport() { final Map bundleSize = new HashMap<>(); bundleSize.put(TRACKED_ENTITY, 1); return ImportReport.withImportCompleted( - Status.OK, createBundleReport(), createValidationReport(), createTimingStats(), bundleSize); - } - - private TimingsStats createTimingStats() { - TimingsStats timingsStats = new TimingsStats(); - timingsStats.set(PROGRAMRULE_OPS, "1 sec."); - timingsStats.set(COMMIT_OPS, "2 sec."); - timingsStats.set(PREHEAT_OPS, "3 sec."); - timingsStats.set(VALIDATION_OPS, "4 sec."); - timingsStats.set(TOTAL_OPS, "10 sec."); - return timingsStats; + Status.OK, createBundleReport(), createValidationReport(), bundleSize); } private ValidationReport createValidationReport() { diff --git a/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java b/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java index 94e394d1fa67..47cfb12c81ed 100644 --- a/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java +++ b/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java @@ -92,6 +92,10 @@ public TrackerApiResponse postAndGetJobReport( return getJobReportByImportResponse(response); } + public ApiResponse checkJobReport(String jobId, String reportMode) { + return this.get(String.format("/jobs/%s/report?reportMode=%s", jobId, reportMode)); + } + public TrackerApiResponse getJobReport(String jobId, String reportMode) { ApiResponse response = this.get(String.format("/jobs/%s/report?reportMode=%s", jobId, reportMode)); @@ -189,6 +193,10 @@ private TrackerApiResponse getJobReportByImportResponse(ApiResponse response) { this.waitUntilJobIsCompleted(jobId); + Callable jobIsCompleted = () -> this.checkJobReport(jobId, "FULL").statusCode(); + + with().atMost(21, TimeUnit.SECONDS).await().until(() -> jobIsCompleted.call() == 200); + return this.getJobReport(jobId, "FULL"); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java index 7d9e651125c2..f4cc60be6c72 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java @@ -53,6 +53,7 @@ import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.junit.jupiter.api.BeforeEach; @@ -75,9 +76,9 @@ class AclEventExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); User userA = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment.json", userA.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); ProgramStage programStage = get(ProgramStage.class, "NpsdDv6kKSO"); program = programStage.getProgram(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java index 2e12ed6d11e1..fe5f8e89b73b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java @@ -44,7 +44,7 @@ import org.hisp.dhis.render.RenderFormat; import org.hisp.dhis.render.RenderService; import org.hisp.dhis.test.integration.SingleSetupIntegrationTestBase; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -107,26 +107,8 @@ protected ObjectBundle setUpMetadata(String path, User user) throws IOException return bundle; } - protected TrackerImportParams fromJson(String path) throws IOException { - TrackerImportParams trackerImportParams = _fromJson(path); - trackerImportParams.setUser(currentUserService.getCurrentUser()); - return trackerImportParams; - } - - protected TrackerImportParams fromJson(String path, String userUid) throws IOException { - TrackerImportParams trackerImportParams = _fromJson(path); - trackerImportParams.setUserId(userUid); - return trackerImportParams; - } - - protected TrackerImportParams fromJson(String path, User user) throws IOException { - TrackerImportParams trackerImportParams = _fromJson(path); - trackerImportParams.setUser(user); - return trackerImportParams; - } - - private TrackerImportParams _fromJson(String path) throws IOException { + protected TrackerObjects fromJson(String path) throws IOException { return renderService.fromJson( - new ClassPathResource(path).getInputStream(), TrackerImportParams.class); + new ClassPathResource(path).getInputStream(), TrackerObjects.class); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java index 28c706005044..6a6c1fcbf173 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java @@ -74,6 +74,7 @@ import org.hisp.dhis.tracker.export.relationship.RelationshipService; import org.hisp.dhis.tracker.export.trackedentity.TrackedEntityOperationParams; import org.hisp.dhis.tracker.export.trackedentity.TrackedEntityService; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.hisp.dhis.webapi.controller.event.mapper.SortDirection; @@ -110,9 +111,9 @@ class OrderAndPaginationExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); importUser = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(importUser.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment.json", importUser.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); programStage = get(ProgramStage.class, "NpsdDv6kKSO"); trackedEntityType = get(TrackedEntityType.class, "ja8NY4PW7Xm"); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java index c2bd259a0c20..edfe77fef37e 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java @@ -59,6 +59,7 @@ import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.junit.jupiter.api.BeforeEach; @@ -84,9 +85,9 @@ class AclEventExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); User userA = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment.json", userA.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); ProgramStage programStage = get(ProgramStage.class, "NpsdDv6kKSO"); program = programStage.getProgram(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java index 33ebe1e366ef..e99448529462 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java @@ -72,6 +72,7 @@ import org.hisp.dhis.relationship.RelationshipItem; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.hisp.dhis.util.DateUtils; @@ -108,9 +109,9 @@ class EventExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); importUser = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(importUser.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment.json", importUser.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); programStage = get(ProgramStage.class, "NpsdDv6kKSO"); program = programStage.getProgram(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java index da06b0dad95d..9f6ea3eff68c 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java @@ -34,6 +34,7 @@ import java.io.IOException; import org.hisp.dhis.trackedentity.TrackedEntityService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.junit.jupiter.api.Test; @@ -52,10 +53,12 @@ public void initTest() throws IOException { @Test void testImportSuccessWithAtomicModeObjectIfThereIsAnErrorInOneTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/one_valid_tei_and_one_invalid.json"); - params.setAtomicMode(AtomicMode.OBJECT); + TrackerObjects trackerObjects = fromJson("tracker/one_valid_tei_and_one_invalid.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).build(); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportTeiReport); assertEquals(Status.OK, trackerImportTeiReport.getStatus()); @@ -66,10 +69,11 @@ void testImportSuccessWithAtomicModeObjectIfThereIsAnErrorInOneTEI() throws IOEx @Test void testImportFailWithAtomicModeAllIfThereIsAnErrorInOneTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/one_valid_tei_and_one_invalid.json"); - params.setAtomicMode(AtomicMode.ALL); + TrackerObjects trackerObjects = fromJson("tracker/one_valid_tei_and_one_invalid.json"); + TrackerImportParams params = TrackerImportParams.builder().atomicMode(AtomicMode.ALL).build(); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportTeiReport); assertEquals(Status.ERROR, trackerImportTeiReport.getStatus()); assertEquals(1, trackerImportTeiReport.getValidationReport().getErrors().size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java index 21edc0b6da59..0ae89946dddc 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports; import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import java.io.IOException; @@ -83,12 +82,7 @@ void testJsonSerialization() throws Exception { + "\"validationMode\":\"SKIP\"," + "\"skipPatternValidation\":false," + "\"skipSideEffects\":false," - + "\"skipRuleEngine\":true," - + "\"trackedEntities\":[]," - + "\"enrollments\":[]," - + "\"events\":[]," - + "\"relationships\":[]," - + "\"username\":\"system-process\"}", + + "\"skipRuleEngine\":true}", json, JSONCompareMode.LENIENT); } @@ -111,12 +105,7 @@ void testJsonDeserialization() throws IOException { + "\"validationMode\":\"SKIP\"," + "\"skipPatternValidation\":true," + "\"skipSideEffects\":true," - + "\"skipRuleEngine\":true," - + "\"trackedEntities\":[]," - + "\"enrollments\":[]," - + "\"events\":[]," - + "\"relationships\":[]," - + "\"username\":\"system-process\"}"; + + "\"skipRuleEngine\":true}"; final TrackerImportParams trackerImportParams = renderService.fromJson(json, TrackerImportParams.class); @@ -129,7 +118,6 @@ void testJsonDeserialization() throws IOException { assertThat(trackerImportParams.isSkipPatternValidation(), is(true)); assertThat(trackerImportParams.isSkipSideEffects(), is(true)); assertThat(trackerImportParams.isSkipRuleEngine(), is(true)); - assertThat(trackerImportParams.getUser(), is(nullValue())); TrackerIdSchemeParams idSchemes = trackerImportParams.getIdSchemes(); assertThat(idSchemes.getIdScheme(), is(TrackerIdSchemeParam.CODE)); assertThat(idSchemes.getProgramIdScheme().getIdScheme(), is(TrackerIdScheme.ATTRIBUTE)); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java index bd652e88b4df..8b5ef6f4e2f1 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java @@ -45,6 +45,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.junit.jupiter.api.Test; @@ -66,12 +67,11 @@ protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); final User userA = userService.getUser("M5zQapPyTZI"); injectSecurityContext(userA); - - TrackerImportParams teiParams = fromJson("tracker/single_tei.json", userA.getUid()); - assertNoErrors(trackerImportService.importTracker(teiParams)); - TrackerImportParams enrollmentParams = - fromJson("tracker/single_enrollment.json", userA.getUid()); - assertNoErrors(trackerImportService.importTracker(enrollmentParams)); + TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + assertNoErrors(trackerImportService.importTracker(params, trackerObjects)); + TrackerObjects enTrackerObjects = fromJson("tracker/single_enrollment.json"); + assertNoErrors(trackerImportService.importTracker(params, enTrackerObjects)); manager.flush(); } @@ -79,7 +79,7 @@ protected void initTest() throws IOException { void successWhenEventHasNoProgramAndHasProgramStage() throws IOException { ImportReport importReport = trackerImportService.importTracker( - fromJson("tracker/validations/events-with_no_program.json")); + new TrackerImportParams(), fromJson("tracker/validations/events-with_no_program.json")); assertNoErrors(importReport); } @@ -87,7 +87,8 @@ void successWhenEventHasNoProgramAndHasProgramStage() throws IOException { @Test void testEventDataValue() throws IOException { ImportReport importReport = - trackerImportService.importTracker(fromJson("tracker/event_with_data_values.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/event_with_data_values.json")); assertNoErrors(importReport); List events = manager.getAll(Event.class); @@ -99,8 +100,9 @@ void testEventDataValue() throws IOException { @Test void testEventDataValueUpdate() throws IOException { - ImportReport importReport = - trackerImportService.importTracker(fromJson("tracker/event_with_data_values.json")); + TrackerObjects trackerObjects = fromJson("tracker/event_with_data_values.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List events = manager.getAll(Event.class); @@ -109,17 +111,10 @@ void testEventDataValueUpdate() throws IOException { Set eventDataValues = event.getEventDataValues(); assertEquals(4, eventDataValues.size()); // update - TrackerImportParams trackerImportParams = - fromJson("tracker/event_with_updated_data_values.json"); - // make sure that the uid property is populated as well - otherwise - // update will - // not work - trackerImportParams - .getEvents() - .get(0) - .setEvent(trackerImportParams.getEvents().get(0).getEvent()); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + + TrackerObjects updatedTrackerObjects = fromJson("tracker/event_with_updated_data_values.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, updatedTrackerObjects); assertNoErrors(importReport); List updatedEvents = manager.getAll(Event.class); assertEquals(1, updatedEvents.size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java index af021c5f645b..e04fe595b412 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java @@ -44,6 +44,7 @@ import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.EnrollmentStatus; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -61,16 +62,19 @@ class LastUpdateImportTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); injectAdminUser(); - TrackerImportParams trackerImportParams = fromJson("tracker/single_tei.json"); - assertNoErrors(trackerImportService.importTracker(trackerImportParams)); - trackedEntity = trackerImportParams.getTrackedEntities().get(0); - assertNoErrors(trackerImportService.importTracker(fromJson("tracker/single_enrollment.json"))); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + assertNoErrors(trackerImportService.importTracker(new TrackerImportParams(), trackerObjects)); + trackedEntity = trackerObjects.getTrackedEntities().get(0); + assertNoErrors( + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/single_enrollment.json"))); manager.flush(); } @Test void shouldUpdateTeiIfTeiIsUpdated() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); trackerImportParams.setImportStrategy(TrackerImportStrategy.UPDATE); Attribute attribute = Attribute.builder() @@ -80,7 +84,7 @@ void shouldUpdateTeiIfTeiIsUpdated() throws IOException { trackedEntity.setAttributes(Collections.singletonList(attribute)); Date lastUpdateBefore = trackedEntityService.getTrackedEntity(trackedEntity.getTrackedEntity()).getLastUpdated(); - assertNoErrors(trackerImportService.importTracker(trackerImportParams)); + assertNoErrors(trackerImportService.importTracker(trackerImportParams, trackerObjects)); assertTrue( manager .get(TrackedEntity.class, trackedEntity.getTrackedEntity()) @@ -91,14 +95,15 @@ void shouldUpdateTeiIfTeiIsUpdated() throws IOException { @Test void shouldUpdateTeiIfEventIsUpdated() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/event_with_data_values.json"); + TrackerObjects trackerObjects = fromJson("tracker/event_with_data_values.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); Date lastUpdateBefore = trackedEntityService.getTrackedEntity(trackedEntity.getTrackedEntity()).getLastUpdated(); - assertNoErrors(trackerImportService.importTracker(trackerImportParams)); + assertNoErrors(trackerImportService.importTracker(trackerImportParams, trackerObjects)); - trackerImportParams = fromJson("tracker/event_with_updated_data_values.json"); + trackerObjects = fromJson("tracker/event_with_updated_data_values.json"); trackerImportParams.setImportStrategy(TrackerImportStrategy.UPDATE); - assertNoErrors(trackerImportService.importTracker(trackerImportParams)); + assertNoErrors(trackerImportService.importTracker(trackerImportParams, trackerObjects)); manager.clear(); assertTrue( manager @@ -110,13 +115,15 @@ void shouldUpdateTeiIfEventIsUpdated() throws IOException { @Test void shouldUpdateTeiIfEnrollmentIsUpdated() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/single_enrollment.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_enrollment.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); Date lastUpdateBefore = trackedEntityService.getTrackedEntity(trackedEntity.getTrackedEntity()).getLastUpdated(); - Enrollment enrollment = trackerImportParams.getEnrollments().get(0); + Enrollment enrollment = trackerObjects.getEnrollments().get(0); enrollment.setStatus(EnrollmentStatus.COMPLETED); trackerImportParams.setImportStrategy(TrackerImportStrategy.UPDATE); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(trackerImportParams, trackerObjects); assertNoErrors(importReport); manager.clear(); assertTrue( diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java index 9c2517c0ad18..017ca502bac7 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java @@ -52,6 +52,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; import org.hisp.dhis.tracker.imports.domain.EnrollmentStatus; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.validation.ValidationCode; import org.hisp.dhis.user.User; @@ -80,18 +81,16 @@ protected void initTest() throws IOException { injectSecurityContext(superUser); nonSuperUser = userService.getUser("Tu9fv8ezgHl"); + TrackerImportParams params = TrackerImportParams.builder().userId(superUser.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/ownership_tei.json", superUser.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/ownership_tei.json"))); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/ownership_enrollment.json", superUser.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/ownership_enrollment.json"))); } @Test void testProgramOwnerWhenEnrolled() throws IOException { - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -104,15 +103,11 @@ void testProgramOwnerWhenEnrolled() throws IOException { assertNotNull(tepo.getTrackedEntity()); assertNotNull(tepo.getProgram()); assertNotNull(tepo.getOrganisationUnit()); - assertTrue(enrollmentParams.getEnrollments().get(0).getProgram().isEqualTo(tepo.getProgram())); + assertTrue(trackerObjects.getEnrollments().get(0).getProgram().isEqualTo(tepo.getProgram())); assertTrue( - enrollmentParams - .getEnrollments() - .get(0) - .getOrgUnit() - .isEqualTo(tepo.getOrganisationUnit())); + trackerObjects.getEnrollments().get(0).getOrgUnit().isEqualTo(tepo.getOrganisationUnit())); assertEquals( - enrollmentParams.getEnrollments().get(0).getTrackedEntity(), + trackerObjects.getEnrollments().get(0).getTrackedEntity(), tepo.getTrackedEntity().getUid()); } @@ -120,14 +115,13 @@ void testProgramOwnerWhenEnrolled() throws IOException { void testClientDatesForTeiEnrollmentEvent() throws IOException { User nonSuperUser = userService.getUser(this.nonSuperUser.getUid()); injectSecurityContext(nonSuperUser); - - TrackerImportParams trackerImportParams = - fromJson("tracker/ownership_event.json", nonSuperUser); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_event.json"); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); manager.flush(); - TrackerImportParams teParams = fromJson("tracker/ownership_tei.json", nonSuperUser); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser); + TrackerObjects teTrackerObjects = fromJson("tracker/ownership_tei.json"); + TrackerObjects enTrackerObjects = fromJson("tracker/ownership_enrollment.json"); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -136,10 +130,10 @@ void testClientDatesForTeiEnrollmentEvent() throws IOException { assertNotNull(te.getCreatedAtClient()); assertNotNull(te.getLastUpdatedAtClient()); assertEquals( - DateUtils.fromInstant(teParams.getTrackedEntities().get(0).getCreatedAtClient()), + DateUtils.fromInstant(teTrackerObjects.getTrackedEntities().get(0).getCreatedAtClient()), te.getCreatedAtClient()); assertEquals( - DateUtils.fromInstant(teParams.getTrackedEntities().get(0).getUpdatedAtClient()), + DateUtils.fromInstant(teTrackerObjects.getTrackedEntities().get(0).getUpdatedAtClient()), te.getLastUpdatedAtClient()); Set enrollments = te.getEnrollments(); assertEquals(1, enrollments.size()); @@ -147,10 +141,10 @@ void testClientDatesForTeiEnrollmentEvent() throws IOException { assertNotNull(enrollment.getCreatedAtClient()); assertNotNull(enrollment.getLastUpdatedAtClient()); assertEquals( - DateUtils.fromInstant(enrollmentParams.getEnrollments().get(0).getCreatedAtClient()), + DateUtils.fromInstant(enTrackerObjects.getEnrollments().get(0).getCreatedAtClient()), enrollment.getCreatedAtClient()); assertEquals( - DateUtils.fromInstant(enrollmentParams.getEnrollments().get(0).getUpdatedAtClient()), + DateUtils.fromInstant(enTrackerObjects.getEnrollments().get(0).getUpdatedAtClient()), enrollment.getLastUpdatedAtClient()); Set events = enrollment.getEvents(); assertEquals(1, events.size()); @@ -158,34 +152,35 @@ void testClientDatesForTeiEnrollmentEvent() throws IOException { assertNotNull(event.getCreatedAtClient()); assertNotNull(event.getLastUpdatedAtClient()); assertEquals( - DateUtils.fromInstant(trackerImportParams.getEvents().get(0).getCreatedAtClient()), + DateUtils.fromInstant(trackerObjects.getEvents().get(0).getCreatedAtClient()), event.getCreatedAtClient()); assertEquals( - DateUtils.fromInstant(trackerImportParams.getEvents().get(0).getUpdatedAtClient()), + DateUtils.fromInstant(trackerObjects.getEvents().get(0).getUpdatedAtClient()), event.getLastUpdatedAtClient()); } @Test void testUpdateEnrollment() throws IOException { - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); Enrollment enrollment = enrollments.stream().filter(e -> e.getUid().equals("TvctPPhpD8u")).findAny().get(); - compareEnrollmentBasicProperties(enrollment, enrollmentParams.getEnrollments().get(0)); + compareEnrollmentBasicProperties(enrollment, trackerObjects.getEnrollments().get(0)); assertNull(enrollment.getCompletedBy()); assertNull(enrollment.getCompletedDate()); org.hisp.dhis.tracker.imports.domain.Enrollment updatedEnrollment = - enrollmentParams.getEnrollments().get(0); + trackerObjects.getEnrollments().get(0); updatedEnrollment.setStatus(EnrollmentStatus.COMPLETED); updatedEnrollment.setCreatedAtClient(Instant.now()); updatedEnrollment.setUpdatedAtClient(Instant.now()); updatedEnrollment.setEnrolledAt(Instant.now()); updatedEnrollment.setOccurredAt(Instant.now()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); manager.flush(); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getUpdated()); @@ -199,13 +194,14 @@ void testUpdateEnrollment() throws IOException { @Test void testDeleteEnrollment() throws IOException { - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); enrollments.stream().filter(e -> e.getUid().equals("TvctPPhpD8u")).findAny().get(); - enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getDeleted()); enrollments = manager.getAll(Enrollment.class); @@ -215,19 +211,20 @@ void testDeleteEnrollment() throws IOException { @Test void testCreateEnrollmentAfterDeleteEnrollment() throws IOException { injectSecurityContext(userService.getUser(nonSuperUser.getUid())); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getDeleted()); enrollments = manager.getAll(Enrollment.class); assertEquals(1, enrollments.size()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE); - enrollmentParams.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); - updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.CREATE); + trackerObjects.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); + updatedReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getCreated()); enrollments = manager.getAll(Enrollment.class); @@ -237,21 +234,22 @@ void testCreateEnrollmentAfterDeleteEnrollment() throws IOException { @Test void testCreateEnrollmentWithoutOwnership() throws IOException { injectSecurityContext(userService.getUser(nonSuperUser.getUid())); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getDeleted()); TrackedEntity te = manager.get(TrackedEntity.class, "IOR1AXXl24H"); OrganisationUnit ou = manager.get(OrganisationUnit.class, "B1nCbRV3qtP"); Program pgm = manager.get(Program.class, "BFcipDERJnf"); trackerOwnershipManager.transferOwnership(te, pgm, ou, true, false); - enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE); - enrollmentParams.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); - updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.CREATE); + trackerObjects.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); + updatedReport = trackerImportService.importTracker(params, trackerObjects); assertEquals(1, updatedReport.getStats().getIgnored()); assertHasError(updatedReport, ValidationCode.E1102); } @@ -262,11 +260,12 @@ void testDeleteEnrollmentWithoutOwnership() throws IOException { TrackedEntity te = manager.get(TrackedEntity.class, "IOR1AXXl24H"); OrganisationUnit ou = manager.get(OrganisationUnit.class, "B1nCbRV3qtP"); Program pgm = manager.get(Program.class, "BFcipDERJnf"); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); trackerOwnershipManager.transferOwnership(te, pgm, ou, true, false); - enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertEquals(1, updatedReport.getStats().getIgnored()); assertHasError(updatedReport, ValidationCode.E1102); } @@ -278,10 +277,11 @@ void testUpdateEnrollmentWithoutOwnership() throws IOException { OrganisationUnit ou = manager.get(OrganisationUnit.class, "B1nCbRV3qtP"); Program pgm = manager.get(Program.class, "BFcipDERJnf"); trackerOwnershipManager.transferOwnership(te, pgm, ou, true, false); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertEquals(1, updatedReport.getStats().getIgnored()); assertHasError(updatedReport, ValidationCode.E1102); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java index fb8daad5335f..c617089cb10c 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java @@ -37,6 +37,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.hisp.dhis.user.User; @@ -58,31 +59,33 @@ class RelationshipImportTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); userA = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); + assertNoErrors(trackerImportService.importTracker(params, fromJson("tracker/single_tei.json"))); assertNoErrors( - trackerImportService.importTracker(fromJson("tracker/single_tei.json", userA.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/single_enrollment.json"))); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/single_enrollment.json", userA.getUid()))); - assertNoErrors( - trackerImportService.importTracker(fromJson("tracker/single_event.json", userA.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/single_event.json"))); manager.flush(); } @Test void successImportingRelationships() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/relationships.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/relationships.json")); assertThat(importReport.getStatus(), is(Status.OK)); assertThat(importReport.getStats().getCreated(), is(2)); } @Test void successUpdateRelationships() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/relationships.json"); - trackerImportService.importTracker(trackerImportParams); - trackerImportParams = fromJson("tracker/relationshipToUpdate.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/relationships.json"); + trackerImportService.importTracker(trackerImportParams, trackerObjects); + trackerObjects = fromJson("tracker/relationshipToUpdate.json"); trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(trackerImportParams, trackerObjects); assertThat(importReport.getStatus(), is(Status.OK)); assertThat(importReport.getStats().getCreated(), is(0)); assertThat(importReport.getStats().getIgnored(), is(1)); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java index ed4ca445cb27..b3e5a208b125 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java @@ -41,6 +41,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.validation.ValidationCode; @@ -58,12 +59,13 @@ class ReportSummaryDeleteIntegrationTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/tracker_basic_metadata.json"); injectAdminUser(); - TrackerImportParams params = fromJson("tracker/tracker_basic_data_before_deletion.json"); - assertEquals(13, params.getTrackedEntities().size()); - assertEquals(2, params.getEnrollments().size()); - assertEquals(2, params.getEvents().size()); + TrackerObjects trackerObjects = fromJson("tracker/tracker_basic_data_before_deletion.json"); + assertEquals(13, trackerObjects.getTrackedEntities().size()); + assertEquals(2, trackerObjects.getEnrollments().size()); + assertEquals(2, trackerObjects.getEvents().size()); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); PersistenceReport persistenceReport = importReport.getPersistenceReport(); assertImportedObjects(13, persistenceReport, TrackerType.TRACKED_ENTITY); @@ -77,11 +79,12 @@ protected void initTest() throws IOException { @Test void testTrackedEntityDeletion() throws IOException { - TrackerImportParams params = fromJson("tracker/tracked_entity_basic_data_for_deletion.json"); + TrackerObjects trackerObjects = fromJson("tracker/tracked_entity_basic_data_for_deletion.json"); + TrackerImportParams params = new TrackerImportParams(); params.setImportStrategy(TrackerImportStrategy.DELETE); - assertEquals(9, params.getTrackedEntities().size()); + assertEquals(9, trackerObjects.getTrackedEntities().size()); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertDeletedObjects(9, importReport.getPersistenceReport(), TrackerType.TRACKED_ENTITY); // remaining @@ -93,10 +96,11 @@ void testTrackedEntityDeletion() throws IOException { void testEnrollmentDeletion() throws IOException { dbmsManager.clearSession(); assertEquals(2, manager.getAll(Event.class).size()); - TrackerImportParams params = fromJson("tracker/enrollment_basic_data_for_deletion.json"); + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/enrollment_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertDeletedObjects(1, importReport.getPersistenceReport(), TrackerType.ENROLLMENT); @@ -108,10 +112,11 @@ void testEnrollmentDeletion() throws IOException { @Test void testEventDeletion() throws IOException { - TrackerImportParams params = fromJson("tracker/event_basic_data_for_deletion.json"); + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/event_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertDeletedObjects(1, importReport.getPersistenceReport(), TrackerType.EVENT); @@ -121,21 +126,23 @@ void testEventDeletion() throws IOException { @Test void testNonExistentEnrollment() throws IOException { - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/non_existent_enrollment_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasError(importReport, ValidationCode.E1081); } @Test void testDeleteMultipleEntities() throws IOException { - TrackerImportParams params = fromJson("tracker/tracker_data_for_deletion.json"); + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/tracker_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertDeletedObjects(1, importReport.getPersistenceReport(), TrackerType.ENROLLMENT); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java index 3f2221e5af24..c0c7e4575eb4 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java @@ -37,6 +37,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.hisp.dhis.user.User; @@ -59,11 +60,12 @@ protected void initTest() throws IOException { @Test void testStatsCountForOneCreatedTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); - params.setUserId(userA.getUid()); - params.setAtomicMode(AtomicMode.OBJECT); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportTeiReport); assertEquals(1, trackerImportTeiReport.getStats().getCreated()); @@ -74,16 +76,19 @@ void testStatsCountForOneCreatedTEI() throws IOException { @Test void testStatsCountForOneCreatedAndOneUpdatedTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_tei_and_one_new_tei.json"); + trackerObjects = fromJson("tracker/one_update_tei_and_one_new_tei.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportTeiReport); assertEquals(1, trackerImportTeiReport.getStats().getCreated()); @@ -94,17 +99,20 @@ void testStatsCountForOneCreatedAndOneUpdatedTEI() throws IOException { @Test void testStatsCountForOneCreatedAndOneUpdatedTEIAndOneInvalidTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_tei_and_one_new_tei_and_one_invalid_tei.json"); + trackerObjects = fromJson("tracker/one_update_tei_and_one_new_tei_and_one_invalid_tei.json"); params.setUserId(userA.getUid()); params.setAtomicMode(AtomicMode.OBJECT); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportTeiReport); assertEquals(Status.OK, trackerImportTeiReport.getStatus()); @@ -117,16 +125,19 @@ void testStatsCountForOneCreatedAndOneUpdatedTEIAndOneInvalidTEI() throws IOExce @Test void testStatsCountForOneCreatedEnrollment() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); + ImportReport trackerImportEnrollmentReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEnrollmentReport); assertEquals(1, trackerImportEnrollmentReport.getStats().getCreated()); @@ -137,16 +148,19 @@ void testStatsCountForOneCreatedEnrollment() throws IOException { @Test void testStatsCountForOneCreatedEnrollmentAndUpdateSameEnrollment() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); + ImportReport trackerImportEnrollmentReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEnrollmentReport); assertEquals(1, trackerImportEnrollmentReport.getStats().getCreated()); @@ -154,11 +168,11 @@ void testStatsCountForOneCreatedEnrollmentAndUpdateSameEnrollment() throws IOExc assertEquals(0, trackerImportEnrollmentReport.getStats().getIgnored()); assertEquals(0, trackerImportEnrollmentReport.getStats().getDeleted()); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - trackerImportEnrollmentReport = trackerImportService.importTracker(params); + trackerImportEnrollmentReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEnrollmentReport); assertEquals(0, trackerImportEnrollmentReport.getStats().getCreated()); @@ -169,21 +183,24 @@ void testStatsCountForOneCreatedEnrollmentAndUpdateSameEnrollment() throws IOExc @Test void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollment() throws IOException { - TrackerImportParams params = fromJson("tracker/one_update_tei_and_one_new_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/one_update_tei_and_one_new_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_enrollment_and_one_new_enrollment.json"); + trackerObjects = fromJson("tracker/one_update_enrollment_and_one_new_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); + ImportReport trackerImportEnrollmentReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEnrollmentReport); assertEquals(1, trackerImportEnrollmentReport.getStats().getCreated()); @@ -195,23 +212,26 @@ void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollment() throws IOExce @Test void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollmentAndOneInvalidEnrollment() throws IOException { - TrackerImportParams params = fromJson("tracker/three_teis.json"); + TrackerObjects trackerObjects = fromJson("tracker/three_teis.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_and_one_new_and_one_invalid_enrollment.json"); + trackerObjects = fromJson("tracker/one_update_and_one_new_and_one_invalid_enrollment.json"); params.setUserId(userA.getUid()); params.setAtomicMode(AtomicMode.OBJECT); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); + ImportReport trackerImportEnrollmentReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportEnrollmentReport); assertEquals(Status.OK, trackerImportEnrollmentReport.getStatus()); @@ -224,20 +244,23 @@ void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollmentAndOneInvalidEnr @Test void testStatsCountForOneCreatedEvent() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_event.json"); + trackerObjects = fromJson("tracker/single_event.json"); params.setUserId(userA.getUid()); - ImportReport trackerImportEventReport = trackerImportService.importTracker(params); + ImportReport trackerImportEventReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEventReport); assertEquals(1, trackerImportEventReport.getStats().getCreated()); @@ -248,26 +271,29 @@ void testStatsCountForOneCreatedEvent() throws IOException { @Test void testStatsCountForOneUpdateEventAndOneNewEvent() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_event.json"); + trackerObjects = fromJson("tracker/single_event.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_event_and_one_new_event.json"); + trackerObjects = fromJson("tracker/one_update_event_and_one_new_event.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEventReport = trackerImportService.importTracker(params); + ImportReport trackerImportEventReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEventReport); assertEquals(1, trackerImportEventReport.getStats().getCreated()); @@ -278,27 +304,30 @@ void testStatsCountForOneUpdateEventAndOneNewEvent() throws IOException { @Test void testStatsCountForOneUpdateEventAndOneNewEventAndOneInvalidEvent() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_event.json"); + trackerObjects = fromJson("tracker/single_event.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_and_one_new_and_one_invalid_event.json"); + trackerObjects = fromJson("tracker/one_update_and_one_new_and_one_invalid_event.json"); params.setUserId(userA.getUid()); params.setAtomicMode(AtomicMode.OBJECT); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEventReport = trackerImportService.importTracker(params); + ImportReport trackerImportEventReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportEventReport); assertEquals(Status.OK, trackerImportEventReport.getStatus()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java index b5d2f85398d7..b5c6e904bbf9 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java @@ -41,8 +41,10 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheatService; import org.hisp.dhis.tracker.imports.report.ImportReport; @@ -70,8 +72,10 @@ protected void initTest() throws IOException { @Test void testTrackedAttributePreheater() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_with_tea_data.json"); - TrackerPreheat preheat = trackerPreheatService.preheat(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/te_with_tea_data.json"); + TrackerPreheat preheat = + trackerPreheatService.preheat( + trackerObjects, new TrackerIdSchemeParams(), userService.getUser(ADMIN_USER_UID)); assertNotNull(preheat.get(OrganisationUnit.class, "cNEZTkdAvmg")); assertNotNull(preheat.get(TrackedEntityType.class, "KrYIdvLxkMb")); assertNotNull(preheat.get(TrackedEntityAttribute.class, "sYn3tkL3XKa")); @@ -81,8 +85,9 @@ void testTrackedAttributePreheater() throws IOException { @Test void testTrackedAttributeValueBundleImporter() throws IOException { - ImportReport importReport = - trackerImportService.importTracker(fromJson("tracker/te_with_tea_data.json")); + TrackerObjects trackerObjects = fromJson("tracker/te_with_tea_data.json"); + TrackerImportParams params = TrackerImportParams.builder().build(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java index bbc7722dc71a..dd59653ea493 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java @@ -46,6 +46,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -71,7 +72,8 @@ protected void initTest() throws IOException { @Test void testTrackedEntityAttributeValueAuditCreate() throws IOException { assertNoErrors( - trackerImportService.importTracker(fromJson("tracker/te_program_with_tea_data.json"))); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/te_program_with_tea_data.json"))); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(1, trackedEntities.size()); @@ -95,9 +97,10 @@ void testTrackedEntityAttributeValueAuditCreate() throws IOException { @Test void testTrackedEntityAttributeValueAuditDelete() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); + TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List attributeValues1 = trackedEntityAttributeValueService.getTrackedEntityAttributeValues( @@ -106,9 +109,9 @@ void testTrackedEntityAttributeValueAuditDelete() throws IOException { attributeValues1.stream() .map(TrackedEntityAttributeValue::getAttribute) .collect(Collectors.toList()); - trackerImportParams = fromJson("tracker/te_program_with_tea_null_data.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/te_program_with_tea_null_data.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); List attributeValueAudits = diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java index fd8935c6ea60..a90f2ee01e9a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java @@ -43,6 +43,7 @@ import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueAudit; import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueAuditService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -77,15 +78,16 @@ protected void initTest() throws IOException { @Test void testTrackedEntityDataValueAuditCreate() throws IOException { + TrackerImportParams params = new TrackerImportParams(); assertNoErrors( trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment_with_data_values.json"))); + params, fromJson("tracker/event_and_enrollment_with_data_values.json"))); assertNoErrors( trackerImportService.importTracker( - fromJson("tracker/event_with_data_values_for_update_audit.json"))); + params, fromJson("tracker/event_with_data_values_for_update_audit.json"))); assertNoErrors( trackerImportService.importTracker( - fromJson("tracker/event_with_data_values_for_delete_audit.json"))); + params, fromJson("tracker/event_with_data_values_for_delete_audit.json"))); dataElement = manager.search(DataElement.class, DE); event = manager.search(Event.class, PSI); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java index 875ff64b62b5..3c3c8dee2e8e 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java @@ -38,6 +38,7 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; @@ -68,6 +69,7 @@ protected void initTest() throws IOException { void testTrackedEntityProgramAttributeEncryptedValue() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/te_program_with_tea_encryption_data.json")); assertNoErrors(importReport); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java index 825b17d073e2..5338a1ddaee6 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java @@ -43,6 +43,7 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; @@ -82,6 +83,7 @@ void testTrackedEntityProgramAttributeFileResourceValue() throws IOException { assertFalse(fileResource.isAssigned()); ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/te_program_with_tea_fileresource_data.json")); assertNoErrors(importReport); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java index 1bd7a6209887..2a0d63d8c3d4 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java @@ -40,6 +40,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -63,8 +64,9 @@ protected void initTest() throws IOException { @Test void testTrackedEntityProgramAttributeValue() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -77,8 +79,9 @@ void testTrackedEntityProgramAttributeValue() throws IOException { @Test void testTrackedEntityProgramAttributeValueUpdate() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -89,9 +92,9 @@ void testTrackedEntityProgramAttributeValueUpdate() throws IOException { assertEquals(5, attributeValues.size()); manager.clear(); // update - trackerImportParams = fromJson("tracker/te_program_with_tea_update_data.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/te_program_with_tea_update_data.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); trackedEntities = manager.getAll(TrackedEntity.class); @@ -104,8 +107,9 @@ void testTrackedEntityProgramAttributeValueUpdate() throws IOException { @Test void testTrackedEntityProgramAttributeValueUpdateAndDelete() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -116,9 +120,9 @@ void testTrackedEntityProgramAttributeValueUpdateAndDelete() throws IOException assertEquals(5, attributeValues.size()); manager.clear(); // update - trackerImportParams = fromJson("tracker/te_program_with_tea_update_data.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/te_program_with_tea_update_data.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); trackedEntities = manager.getAll(TrackedEntity.class); @@ -129,9 +133,9 @@ void testTrackedEntityProgramAttributeValueUpdateAndDelete() throws IOException assertEquals(5, attributeValues.size()); manager.clear(); // delete - trackerImportParams = fromJson("tracker/te_program_with_tea_delete_data.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.DELETE); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/te_program_with_tea_delete_data.json"); + params.setImportStrategy(TrackerImportStrategy.DELETE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); trackedEntities = manager.getAll(TrackedEntity.class); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java index 3519956be68b..85f96e5a0bce 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java @@ -39,6 +39,7 @@ import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -67,9 +68,11 @@ void testVerifyMetadata() { @Test void testTrackedEntityImport() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/trackedentity_basic_data.json"); - assertEquals(13, trackerImportParams.getTrackedEntities().size()); - TrackerBundle trackerBundle = trackerBundleService.create(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/trackedentity_basic_data.json"); + assertEquals(13, trackerObjects.getTrackedEntities().size()); + TrackerBundle trackerBundle = + trackerBundleService.create( + new TrackerImportParams(), trackerObjects, userService.getUser(ADMIN_USER_UID)); trackerBundleService.commit(trackerBundle); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(13, trackedEntities.size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java index b67f6fcc79fd..36acc0dc557c 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java @@ -38,6 +38,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -58,9 +59,10 @@ protected void initTest() throws IOException { @Test void testCreateSingleEventData() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/event_events_and_enrollment.json"); - assertEquals(8, trackerImportParams.getEvents().size()); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/event_events_and_enrollment.json"); + assertEquals(8, trackerObjects.getEvents().size()); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); List events = eventStore.getAll(); @@ -69,13 +71,15 @@ void testCreateSingleEventData() throws IOException { @Test void testUpdateSingleEventData() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/event_events_and_enrollment.json"); + TrackerObjects trackerObjects = fromJson("tracker/event_events_and_enrollment.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(trackerImportParams, trackerObjects); assertNoErrors(importReport); assertEquals(8, eventStore.getAll().size()); - importReport = trackerImportService.importTracker(trackerImportParams); + importReport = trackerImportService.importTracker(trackerImportParams, trackerObjects); assertNoErrors(importReport); assertEquals(8, eventStore.getAll().size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java index 17ecd943bbc5..f548deddc7e6 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java @@ -40,6 +40,7 @@ import org.hisp.dhis.programrule.ProgramRuleService; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -70,9 +71,11 @@ protected void initTest() throws IOException { @Test void testRunRuleEngineForEventOnBundleCreate() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/event_events_and_enrollment.json"); - assertEquals(8, trackerImportParams.getEvents().size()); - TrackerBundle trackerBundle = trackerBundleService.create(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/event_events_and_enrollment.json"); + assertEquals(8, trackerObjects.getEvents().size()); + TrackerBundle trackerBundle = + trackerBundleService.create( + new TrackerImportParams(), trackerObjects, userService.getUser(ADMIN_USER_UID)); trackerBundle = trackerBundleService.runRuleEngine(trackerBundle); assertEquals(trackerBundle.getEvents().size(), trackerBundle.getEventRuleEffects().size()); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java index 91bf43adb2f4..373b53f17c34 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java @@ -36,6 +36,7 @@ import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.program.notification.ProgramNotificationInstance; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Disabled; @@ -61,6 +62,7 @@ protected void initTest() throws IOException { void testRuleEngineSideEffectHandlerService() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/enrollment_data_with_program_rule_side_effects.json")); assertNoErrors(importReport); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java index c77a08a2de31..2d6d3a54558a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java @@ -30,7 +30,6 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.hisp.dhis.tracker.imports.TrackerIdSchemeParams.builder; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -54,10 +53,11 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.user.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -69,9 +69,12 @@ class TrackerPreheatIdentifiersTest extends TrackerTest { @Autowired private IdentifiableObjectManager manager; + private User user; + @Override protected void initTest() throws IOException { setUpMetadata("tracker/identifier_metadata.json"); + user = currentUserService.getCurrentUser(); } @Test @@ -81,9 +84,10 @@ void testOrgUnitIdentifiers() { String id = pair.getLeft(); TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().orgUnit(param.toMetadataIdentifier(id)).build(); - TrackerImportParams params = buildParams(event, builder().orgUnitIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = TrackerIdSchemeParams.builder().orgUnitIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, OrganisationUnit.class, param, id); } @@ -96,10 +100,11 @@ void testProgramStageIdentifiers() { String id = pair.getLeft(); TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().programStage(param.toMetadataIdentifier(id)).build(); - TrackerImportParams params = - buildParams(event, builder().programStageIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder().programStageIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, ProgramStage.class, param, id); } @@ -118,9 +123,11 @@ void testDataElementIdentifiers() { .programStage(MetadataIdentifier.ofUid("NpsdDv6kKSO")) .dataValues(Collections.singleton(dv1)) .build(); - TrackerImportParams params = buildParams(event, builder().dataElementIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder().dataElementIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, DataElement.class, param, id); } @@ -134,10 +141,11 @@ void testCategoryOptionIdentifiers() { TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().attributeCategoryOptions(Set.of(param.toMetadataIdentifier(id))).build(); - TrackerImportParams params = - buildParams(event, builder().categoryOptionIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder().categoryOptionIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, CategoryOption.class, param, id); } @@ -150,10 +158,11 @@ void testCategoryOptionComboIdentifiers() { String id = pair.getLeft(); TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().attributeOptionCombo(param.toMetadataIdentifier(id)).build(); - TrackerImportParams params = - buildParams(event, builder().categoryOptionComboIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder().categoryOptionComboIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, CategoryOptionCombo.class, param, id); } @@ -162,10 +171,10 @@ void testCategoryOptionComboIdentifiers() { @Test void testDefaultsWithIdSchemeUID() { - TrackerImportParams params = - TrackerImportParams.builder().user(currentUserService.getCurrentUser()).build(); + TrackerObjects trackerObjects = TrackerObjects.builder().build(); + TrackerIdSchemeParams params = TrackerIdSchemeParams.builder().build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatHasDefault(preheat, Category.class); assertPreheatHasDefault(preheat, CategoryCombo.class); @@ -175,20 +184,15 @@ void testDefaultsWithIdSchemeUID() { @Test void testDefaultsWithIdSchemesOtherThanUID() { + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(new Event())).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder() + .idScheme(TrackerIdSchemeParam.NAME) + .categoryOptionIdScheme(TrackerIdSchemeParam.ofAttribute(CodeGenerator.generateUid())) + .categoryOptionComboIdScheme(TrackerIdSchemeParam.CODE) + .build(); - Event event = new Event(); - - TrackerImportParams params = - buildParams( - event, - builder() - .idScheme(TrackerIdSchemeParam.NAME) - .categoryOptionIdScheme( - TrackerIdSchemeParam.ofAttribute(CodeGenerator.generateUid())) - .categoryOptionComboIdScheme(TrackerIdSchemeParam.CODE) - .build()); - - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatHasDefault(preheat, Category.class); assertPreheatHasDefault(preheat, CategoryCombo.class); @@ -196,16 +200,6 @@ void testDefaultsWithIdSchemesOtherThanUID() { assertPreheatHasDefault(preheat, CategoryOptionCombo.class); } - private TrackerImportParams buildParams(Event event, TrackerIdSchemeParams idParams) { - TrackerImportParams params = - TrackerImportParams.builder() - .events(Collections.singletonList(event)) - .user(currentUserService.getCurrentUser()) - .idSchemes(idParams) - .build(); - return params; - } - private List> buildDataSet( String uid, String code, String name) { List> data = new ArrayList<>(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java index 5f3f45d3f588..78ba1fa1b5c6 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java @@ -45,10 +45,10 @@ import org.hisp.dhis.trackedentity.TrackedEntityTypeService; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; import org.junit.jupiter.api.Test; @@ -120,20 +120,21 @@ void testPreheatWithDifferentIdSchemes() { .trackedEntity("TE123456789") .build(); - TrackerImportParams params = - TrackerImportParams.builder() - .user(currentUser) + TrackerObjects trackerObjects = + TrackerObjects.builder() .trackedEntities(Lists.newArrayList(teA)) .enrollments(Lists.newArrayList(enrollmentA)) - .idSchemes( - TrackerIdSchemeParams.builder() - .idScheme(TrackerIdSchemeParam.UID) - .orgUnitIdScheme(TrackerIdSchemeParam.CODE) - .programIdScheme(TrackerIdSchemeParam.ofAttribute(ATTRIBUTE_UID)) - .build()) .build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerIdSchemeParams idSchemeParams = + TrackerIdSchemeParams.builder() + .idScheme(TrackerIdSchemeParam.UID) + .orgUnitIdScheme(TrackerIdSchemeParam.CODE) + .programIdScheme(TrackerIdSchemeParam.ofAttribute(ATTRIBUTE_UID)) + .build(); + + TrackerPreheat preheat = + trackerPreheatService.preheat(trackerObjects, idSchemeParams, currentUser); assertNotNull(preheat); // asserting on specific fields instead of plain assertEquals since diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java index 4cfaa53f987a..b17a4517f57b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java @@ -42,12 +42,11 @@ import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerIdentifierCollector; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -65,11 +64,11 @@ protected void initTest() {} @Test void testCollectIdentifiersEvents() throws IOException { - TrackerImportParams params = fromJson("tracker/event_events.json"); - assertTrue(params.getTrackedEntities().isEmpty()); - assertTrue(params.getEnrollments().isEmpty()); - assertFalse(params.getEvents().isEmpty()); - Map, Set> collectedMap = identifierCollector.collect(params); + TrackerObjects trackerObjects = fromJson("tracker/event_events.json"); + assertTrue(trackerObjects.getTrackedEntities().isEmpty()); + assertTrue(trackerObjects.getEnrollments().isEmpty()); + assertFalse(trackerObjects.getEvents().isEmpty()); + Map, Set> collectedMap = identifierCollector.collect(trackerObjects); assertTrue(collectedMap.containsKey(DataElement.class)); assertTrue(collectedMap.containsKey(ProgramStage.class)); assertTrue(collectedMap.containsKey(OrganisationUnit.class)); @@ -103,12 +102,8 @@ void testCollectIdentifiersEvents() throws IOException { @Test void testCollectIdentifiersAttributeValues() { - TrackerImportParams params = - TrackerImportParams.builder() - .idSchemes( - TrackerIdSchemeParams.builder() - .idScheme(TrackerIdSchemeParam.ofAttribute("ATTR1234567")) - .build()) + TrackerObjects trackerObjects = + TrackerObjects.builder() .trackedEntities( Lists.newArrayList( TrackedEntity.builder() @@ -116,10 +111,10 @@ void testCollectIdentifiersAttributeValues() { .orgUnit(MetadataIdentifier.ofCode("OU123456789")) .build())) .build(); - assertFalse(params.getTrackedEntities().isEmpty()); - assertTrue(params.getEnrollments().isEmpty()); - assertTrue(params.getEvents().isEmpty()); - Map, Set> collectedMap = identifierCollector.collect(params); + assertFalse(trackerObjects.getTrackedEntities().isEmpty()); + assertTrue(trackerObjects.getEnrollments().isEmpty()); + assertTrue(trackerObjects.getEvents().isEmpty()); + Map, Set> collectedMap = identifierCollector.collect(trackerObjects); assertTrue(collectedMap.containsKey(TrackedEntity.class)); Set trackedEntities = collectedMap.get(TrackedEntity.class); assertTrue(collectedMap.containsKey(OrganisationUnit.class)); @@ -132,21 +127,20 @@ void testCollectIdentifiersAttributeValues() { @Test void testPreheatValidation() throws IOException { - TrackerImportParams params = fromJson("tracker/event_events.json"); - assertTrue(params.getTrackedEntities().isEmpty()); - assertTrue(params.getEnrollments().isEmpty()); - assertFalse(params.getEvents().isEmpty()); + TrackerObjects trackerObjects = fromJson("tracker/event_events.json"); + assertTrue(trackerObjects.getTrackedEntities().isEmpty()); + assertTrue(trackerObjects.getEnrollments().isEmpty()); + assertFalse(trackerObjects.getEvents().isEmpty()); } @Test void testPreheatEvents() throws IOException { setUpMetadata("tracker/event_metadata.json"); - TrackerImportParams params = fromJson("tracker/event_events.json"); - assertTrue(params.getTrackedEntities().isEmpty()); - assertTrue(params.getEnrollments().isEmpty()); - assertFalse(params.getEvents().isEmpty()); + TrackerObjects trackerObjects = fromJson("tracker/event_events.json"); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = + trackerPreheatService.preheat( + trackerObjects, new TrackerIdSchemeParams(), userService.getUser(ADMIN_USER_UID)); assertNotNull(preheat); assertFalse(preheat.getAll(DataElement.class).isEmpty()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java index e33d41b7760a..3d27f7cd4b68 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java @@ -52,6 +52,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -86,28 +87,31 @@ public void initTest() throws IOException { assignProgramRule(); trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_completed_event.json")); } @Test void shouldImportWithWarningWhenDataElementWithSameValueIsAssignedByAssignRule() throws IOException { - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/programrule/event_update_datavalue_same_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyWarnings(importReport, E1308); } @Test void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() throws IOException { - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/programrule/event_update_datavalue_different_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, E1307); } @@ -117,11 +121,12 @@ void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() th shouldImportWithWarningWhenDataElementWithDifferentValueIsAssignedByAssignRuleAndOverwriteKeyIsTrue() throws IOException { systemSettingManager.saveSystemSetting(SettingKey.RULE_ENGINE_ASSIGN_OVERWRITE, true); - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/programrule/event_update_datavalue_different_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyWarnings(importReport, E1308); } @@ -131,11 +136,12 @@ void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() th shouldImportWithWarningWhenDataElementWithDifferentAndEmptyValueIsAssignedByAssignRuleAndOverwriteKeyIsTrue() throws IOException { systemSettingManager.saveSystemSetting(SettingKey.RULE_ENGINE_ASSIGN_OVERWRITE, true); - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/programrule/event_update_datavalue_empty_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyWarnings(importReport, E1308); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java index 484ca72cfc65..44e00dbd3e3a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java @@ -55,6 +55,7 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.validation.ValidationCode; import org.junit.jupiter.api.Test; @@ -111,7 +112,8 @@ public void initTest() throws IOException { @Test void shouldImportEnrollmentWithNoWarningsWhenThereAreNoProgramRules() throws IOException { ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertNoErrorsAndNoWarnings(report); } @@ -120,7 +122,8 @@ void shouldImportEnrollmentWithNoWarningsWhenThereAreNoProgramRules() throws IOE void shouldImportEnrollmentWithWarningsWhenAWarningIsTriggered() throws IOException { alwaysTrueWarningProgramRule(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertHasOnlyWarnings(report, E1300); } @@ -129,7 +132,8 @@ void shouldImportEnrollmentWithWarningsWhenAWarningIsTriggered() throws IOExcept void shouldNotImportEnrollmentWhenAnErrorIsTriggered() throws IOException { alwaysTrueErrorProgramRule(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertHasOnlyErrors(report, E1300); } @@ -138,7 +142,8 @@ void shouldNotImportEnrollmentWhenAnErrorIsTriggered() throws IOException { void shouldImportProgramEventWithWarningsWhenAWarningIsTriggered() throws IOException { alwaysTrueWarningProgramEventProgramRule(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/program_event.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/program_event.json")); assertHasOnlyWarnings(report, E1300); } @@ -148,7 +153,8 @@ void shouldNotImportProgramEventWhenAnErrorIsTriggeredBasedOnConditionEvaluating throws IOException { conditionWithConstantEvaluatesToTrue(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/program_event.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/program_event.json")); assertHasOnlyErrors(report, E1300); } @@ -157,7 +163,8 @@ void shouldNotImportProgramEventWhenAnErrorIsTriggeredBasedOnConditionEvaluating void shouldNotImportProgramEventWhenAnErrorIsTriggered() throws IOException { alwaysTrueErrorProgramEventProgramRule(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/program_event.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/program_event.json")); assertHasOnlyErrors(report, E1300); } @@ -166,6 +173,7 @@ void shouldNotImportProgramEventWhenAnErrorIsTriggered() throws IOException { void shouldImportEventWithNoWarningsWhenThereAreNoProgramRules() throws IOException { ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_completed_event.json")); assertNoErrorsAndNoWarnings(report); @@ -174,11 +182,14 @@ void shouldImportEventWithNoWarningsWhenThereAreNoProgramRules() throws IOExcept @Test void shouldImportEventWithWarningsWhenAWarningIsTriggered() throws IOException { ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertNoErrors(report); alwaysTrueWarningProgramRule(); - report = trackerImportService.importTracker(fromJson("tracker/programrule/event.json")); + report = + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/event.json")); assertHasOnlyWarnings(report, E1300); } @@ -186,11 +197,14 @@ void shouldImportEventWithWarningsWhenAWarningIsTriggered() throws IOException { @Test void shouldNotImportEventWhenAnErrorIsTriggered() throws IOException { ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertNoErrors(report); alwaysTrueErrorProgramRule(); - report = trackerImportService.importTracker(fromJson("tracker/programrule/event.json")); + report = + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/event.json")); assertHasOnlyErrors(report, E1300); } @@ -201,6 +215,7 @@ void shouldNotValidateEventAndValidateEnrollmentWhenAnErrorIsTriggeredOnEvent() onCompleteErrorProgramRule(); ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_completed_event.json")); assertHasOnlyErrors(report, E1300); @@ -211,6 +226,7 @@ void shouldNotImportEventAndEnrollmentWhenAnErrorIsTriggeredOnEnrollment() throw onCompleteErrorProgramRule(); ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_completed_enrollment_event.json")); assertAll( @@ -222,11 +238,14 @@ void shouldNotImportEventAndEnrollmentWhenAnErrorIsTriggeredOnEnrollment() throw void shouldImportEventWhenAnErrorIsTriggeredOnEnrollmentAlreadyPresentInDB() throws IOException { ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_completed_enrollment.json")); assertNoErrorsAndNoWarnings(report); onCompleteErrorProgramRule(); - report = trackerImportService.importTracker(fromJson("tracker/programrule/event.json")); + report = + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/event.json")); assertNoErrorsAndNoWarnings(report); } @@ -237,6 +256,7 @@ void shouldNotImportWhenErrorIsTriggeredOnAllEntities() throws IOException { alwaysTrueErrorProgramEventProgramRule(); ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_event_programevent.json")); assertAll( @@ -248,9 +268,10 @@ void shouldNotImportWhenErrorIsTriggeredOnAllEntities() throws IOException { @Test void shouldImportWithWarningWhenARuleWithASyntaxErrorIsTriggered() throws IOException { syntaxErrorRule(); - TrackerImportParams params = fromJson("tracker/programrule/tei_enrollment.json"); + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyWarnings(importReport, E1300); } @@ -259,10 +280,11 @@ void shouldImportWithWarningWhenARuleWithASyntaxErrorIsTriggered() throws IOExce void shouldImportWithWarningWhenAWarningIsTriggeredOnEventInSameProgramStage() throws IOException { programStageWarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment_completed_event.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyWarnings(importReport, E1300); } @@ -271,11 +293,12 @@ void shouldImportWithWarningWhenAWarningIsTriggeredOnEventInSameProgramStage() void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnEventInDifferentProgramStage() throws IOException { programStageWarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson( "tracker/programrule/tei_enrollment_completed_event_from_another_program_stage.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } @@ -284,10 +307,11 @@ void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnEventInDifferentProgramS void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnActiveEventInOnCompleteProgramStage() throws IOException { programStage2WarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment_event_from_another_program_stage.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } @@ -296,11 +320,12 @@ void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnActiveEventInOnCompleteP void shouldImportWithWarningsWhenAWarningIsTriggeredOnCompletedEventInOnCompleteProgramStage() throws IOException { programStage2WarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson( "tracker/programrule/tei_enrollment_completed_event_from_another_program_stage.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyWarnings(importReport, E1300); } @@ -309,11 +334,12 @@ void shouldImportWithWarningsWhenAWarningIsTriggeredOnCompletedEventInOnComplete void shouldImportWithNoWarningsWhenAWarningIsTriggeredWithADataElementFromADifferentProgramStage() throws IOException { programStage2WrongDataElementWarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson( "tracker/programrule/tei_enrollment_completed_event_from_another_program_stage.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } @@ -321,10 +347,11 @@ void shouldImportWithNoWarningsWhenAWarningIsTriggeredWithADataElementFromADiffe @Test void shouldNotImportWithWhenDataElementHasValue() throws IOException { showErrorWhenVariableHasValueRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_completed_enrollment_event.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, E1300); } @@ -332,10 +359,11 @@ void shouldNotImportWithWhenDataElementHasValue() throws IOException { @Test void shouldImportWithNoWarningsWhenDataElementHasNoValue() throws IOException { showErrorWhenVariableHasValueRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment_event_with_no_data_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } @@ -343,10 +371,11 @@ void shouldImportWithNoWarningsWhenDataElementHasNoValue() throws IOException { @Test void shouldImportWithNoWarningsWhenDataElementHasNullValue() throws IOException { showErrorWhenVariableHasValueRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment_event_with_null_data_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java index c724d547332e..56fa2c88b94b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java @@ -36,6 +36,7 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -54,119 +55,130 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data_2.json"))); manager.flush(); } @Test void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_with_invalid_option_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1125); } @Test void successValidationWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_with_valid_option_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void testAttributesMissingUid() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-missing-uuid.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1075); } @Test void testAttributesMissingValues() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-missing-value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1076); } @Test void testAttributesMissingTeA() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-non-existing.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1006); } @Test void testAttributesMissingMandatory() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-missing-mandatory.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1018); } @Test void testAttributesUniquenessInSameTei() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr_same_tei.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void testAttributesUniquenessAlreadyInDB() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_te-data_3.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_te-data_3.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - params = fromJson("tracker/validations/enrollments_te_unique_attr_same_tei.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr_same_tei.json"); - importReport = trackerImportService.importTracker(params); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - params = fromJson("tracker/validations/enrollments_te_unique_attr_in_db.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr_in_db.json"); - importReport = trackerImportService.importTracker(params); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1064); } @Test void testAttributesUniquenessInDifferentTeis() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_te-data_3.json"); - assertNoErrors(trackerImportService.importTracker(params)); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_te-data_3.json"); + assertNoErrors(trackerImportService.importTracker(new TrackerImportParams(), trackerObjects)); manager.flush(); manager.clear(); - params = fromJson("tracker/validations/enrollments_te_unique_attr.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasErrors(importReport, 2, ValidationCode.E1064); } @Test void testAttributesOnlyProgramAttrAllowed() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-only-program-attr.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1019); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java index e66a95192ca9..9feb1f5ff0ad 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java @@ -40,9 +40,11 @@ import org.hisp.dhis.program.EnrollmentService; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.TrackerType; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheatService; import org.hisp.dhis.tracker.imports.report.ImportReport; @@ -68,28 +70,33 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); manager.flush(); } @Test void testEnrollmentValidationOkAll() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void testPreheatOwnershipForSubsequentEnrollment() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - TrackerImportParams secondParams = + TrackerObjects secondTrackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - TrackerPreheat preheat = trackerPreheatService.preheat(secondParams); - secondParams + TrackerPreheat preheat = + trackerPreheatService.preheat( + secondTrackerObjects, new TrackerIdSchemeParams(), userService.getUser(ADMIN_USER_UID)); + secondTrackerObjects .getEnrollments() .forEach( e -> { @@ -113,31 +120,34 @@ void testDisplayIncidentDateTrueButDateValueIsInvalid() { @Test void testNoWriteAccessToOrg() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); User user = userService.getUser(USER_2); - params.setUser(user); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 4, ValidationCode.E1000); } @Test void testOnlyProgramAttributesAllowedOnEnrollments() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_error_non_program_attr.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasErrors(importReport, 3, ValidationCode.E1019); } @Test void testAttributesOk() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-data.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); assertEquals( @@ -153,45 +163,49 @@ void testAttributesOk() throws IOException { @Test void testDeleteCascadeEnrollments() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-data.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); manager.flush(); importEvents(); manager.flush(); - params = fromJson("tracker/validations/enrollments_te_attr-data.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_attr-data.json"); User user2 = userService.getUser(USER_4); - params.setUser(user2); + params.setUserId(user2.getUid()); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport trackerImportDeleteReport = trackerImportService.importTracker(params); + ImportReport trackerImportDeleteReport = + trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(trackerImportDeleteReport, ValidationCode.E1103, ValidationCode.E1091); } protected void importEvents() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/events-with-registration.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-registration.json"); + TrackerImportParams params = new TrackerImportParams(); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testActiveEnrollmentAlreadyExists() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_double-tei-enrollment_part1.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - TrackerImportParams trackerImportParams1 = + TrackerObjects trackerObjects2 = fromJson("tracker/validations/enrollments_double-tei-enrollment_part2.json"); - importReport = trackerImportService.importTracker(trackerImportParams1); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects2); ValidationReport validationResult = importReport.getValidationReport(); @@ -200,19 +214,21 @@ void testActiveEnrollmentAlreadyExists() throws IOException { @Test void testEnrollmentDeleteOk() throws IOException { - TrackerImportParams paramsCreate = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = trackerImportService.importTracker(paramsCreate); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - TrackerImportParams paramsDelete = + TrackerObjects deleteTrackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data-delete.json"); - paramsDelete.setImportStrategy(TrackerImportStrategy.DELETE); + params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReportDelete = trackerImportService.importTracker(paramsDelete); + ImportReport importReportDelete = + trackerImportService.importTracker(params, deleteTrackerObjects); assertNoErrors(importReportDelete); assertEquals(1, importReportDelete.getStats().getDeleted()); @@ -221,9 +237,11 @@ void testEnrollmentDeleteOk() throws IOException { /** Notes with no value are ignored */ @Test void testBadEnrollmentNoteNoValue() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_bad-note-no-value.json"); + TrackerObjects trackerObjects = + fromJson("tracker/validations/enrollments_bad-note-no-value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java index 650514afb414..3e5218410c38 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java @@ -53,6 +53,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -163,19 +164,21 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); } @Test void testNoWriteAccessToOrg() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); User user = userService.getUser(USER_2); injectSecurityContext(user); - params.setUser(user); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 4, ValidationCode.E1000); } @@ -193,11 +196,12 @@ void testUserNoAccessToTrackedEntity() throws IOException { createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); userService.addUser(user); injectSecurityContext(user); - TrackerImportParams params = fromJson("tracker/validations/enrollments_no-access-tei.json"); - params.setUser(user); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_no-access-tei.json"); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1104); } @@ -219,11 +223,13 @@ void testUserNoWriteAccessToProgram() throws IOException { createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); userService.addUser(user); injectSecurityContext(user); - TrackerImportParams params = fromJson("tracker/validations/enrollments_no-access-program.json"); - params.setUser(user); + TrackerObjects trackerObjects = + fromJson("tracker/validations/enrollments_no-access-program.json"); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1091); } @@ -241,11 +247,13 @@ void testUserHasWriteAccessToProgram() throws IOException { createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); userService.addUser(user); injectSecurityContext(user); - TrackerImportParams params = fromJson("tracker/validations/enrollments_no-access-program.json"); - params.setUser(user); + TrackerObjects trackerObjects = + fromJson("tracker/validations/enrollments_no-access-program.json"); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @@ -262,12 +270,13 @@ void testUserHasNoAccessToProgramTeiType() throws IOException { User user = createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); injectSecurityContext(user); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_program-teitype-missmatch.json"); - params.setUser(user); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1104); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java index 6faf730c1010..97701106ae92 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java @@ -59,6 +59,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.TrackerTypeReport; import org.hisp.dhis.user.User; @@ -85,9 +86,11 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_enrollments-data.json"))); } @@ -95,6 +98,7 @@ protected void initTest() throws IOException { void testInvalidEnrollmentPreventsValidEventFromBeingCreated() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/invalid_enrollment_with_valid_event.json")); assertHasOnlyErrors(importReport, ValidationCode.E1070, ValidationCode.E5000); @@ -104,6 +108,7 @@ void testInvalidEnrollmentPreventsValidEventFromBeingCreated() throws IOExceptio void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-with_invalid_option_value.json")); assertHasOnlyErrors(importReport, ValidationCode.E1125); @@ -113,6 +118,7 @@ void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOExce void successWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-with_valid_option_value.json")); assertNoErrors(importReport); @@ -122,6 +128,7 @@ void successWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { void testEventValidationOkAll() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-with-registration.json")); assertNoErrors(importReport); @@ -131,6 +138,7 @@ void testEventValidationOkAll() throws IOException { void testEventValidationOkWithoutAttributeOptionCombo() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-without-attribute-option-combo.json")); assertNoErrors(importReport); @@ -138,24 +146,24 @@ void testEventValidationOkWithoutAttributeOptionCombo() throws IOException { @Test void testTrackerAndProgramEventUpdateSuccess() throws IOException { - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/program_and_tracker_events.json"); - assertNoErrors(trackerImportService.importTracker(trackerBundleParams)); + TrackerObjects trackerObjects = fromJson("tracker/validations/program_and_tracker_events.json"); + TrackerImportParams params = new TrackerImportParams(); + assertNoErrors(trackerImportService.importTracker(params, trackerObjects)); - trackerBundleParams.setImportStrategy(UPDATE); - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + params.setImportStrategy(UPDATE); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testCantWriteAccessCatCombo() throws IOException { - TrackerImportParams trackerImportParams = - fromJson("tracker/validations/events-cat-write-access.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-cat-write-access.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_6); - trackerImportParams.setUser(user); + params.setUserId(user.getUid()); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors( importReport, @@ -167,44 +175,45 @@ void testCantWriteAccessCatCombo() throws IOException { @Test void testNoWriteAccessToOrg() throws IOException { - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/events-with-registration.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-registration.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_2); - trackerBundleParams.setUser(user); - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + params.setUserId(user.getUid()); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1000); } @Test void testNonRepeatableProgramStage() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/events_non-repeatable-programstage_part1.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - trackerImportParams = - fromJson("tracker/validations/events_non-repeatable-programstage_part2.json"); + trackerObjects = fromJson("tracker/validations/events_non-repeatable-programstage_part2.json"); - importReport = trackerImportService.importTracker(trackerImportParams); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1039); } @Test void shouldSuccessfullyImportRepeatedEventsInEventProgram() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/program_events_non-repeatable-programstage_part1.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - trackerImportParams = + trackerObjects = fromJson("tracker/validations/program_events_non-repeatable-programstage_part2.json"); - importReport = trackerImportService.importTracker(trackerImportParams); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @@ -219,6 +228,7 @@ void testWrongScheduledDateString() { void testEventProgramHasNonDefaultCategoryCombo() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_non-default-combo.json")); assertHasOnlyErrors(importReport, ValidationCode.E1055); @@ -228,6 +238,7 @@ void testEventProgramHasNonDefaultCategoryCombo() throws IOException { void testCategoryOptionComboNotFound() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-cat-opt-combo.json")); assertHasOnlyErrors(importReport, ValidationCode.E1115); @@ -237,6 +248,7 @@ void testCategoryOptionComboNotFound() throws IOException { void testCategoryOptionComboNotFoundGivenSubsetOfCategoryOptions() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-aoc-with-subset-of-cos.json")); assertHasOnlyErrors(importReport, ValidationCode.E1117); @@ -246,6 +258,7 @@ void testCategoryOptionComboNotFoundGivenSubsetOfCategoryOptions() throws IOExce void testCOFoundButAOCNotFound() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-aoc-but-co-exists.json")); assertHasOnlyErrors(importReport, ValidationCode.E1115); @@ -255,6 +268,7 @@ void testCOFoundButAOCNotFound() throws IOException { void testCategoryOptionsNotFound() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-cat-option.json")); assertHasOnlyErrors(importReport, ValidationCode.E1116); @@ -264,6 +278,7 @@ void testCategoryOptionsNotFound() throws IOException { void testAttributeCategoryOptionNotInProgramCC() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-aoc-not-in-program-cc.json")); assertHasOnlyErrors(importReport, ValidationCode.E1054); @@ -273,6 +288,7 @@ void testAttributeCategoryOptionNotInProgramCC() throws IOException { void testAttributeCategoryOptionAndCODoNotMatch() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-aoc-and-co-dont-match.json")); assertHasOnlyErrors(importReport, ValidationCode.E1117); @@ -283,6 +299,7 @@ void testAttributeCategoryOptionCannotBeFoundForEventProgramCCAndGivenCategoryOp throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson( "tracker/validations/events_cant-find-cat-option-combo-for-given-cc-and-co.json")); @@ -293,6 +310,7 @@ void testAttributeCategoryOptionCannotBeFoundForEventProgramCCAndGivenCategoryOp void testWrongDatesInCatCombo() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_combo-date-wrong.json")); assertHasOnlyErrors(importReport, ValidationCode.E1056, ValidationCode.E1057); @@ -362,41 +380,43 @@ private void testDeletedEventFails(TrackerImportStrategy importStrategy) { assertNotNull(event); // When -> Soft-delete the event programStageServiceInstance.deleteEvent(event); - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/events-with-notes-data.json"); - trackerBundleParams.setImportStrategy(importStrategy); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-notes-data.json"); + TrackerImportParams params = new TrackerImportParams(); + params.setImportStrategy(importStrategy); // When - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1082); } @Test void testEventDeleteOk() throws IOException { - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/events-with-registration.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-registration.json"); + TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - TrackerImportParams paramsDelete = fromJson("tracker/validations/event-data-delete.json"); - paramsDelete.setImportStrategy(DELETE); + TrackerObjects deleteTrackerObjects = fromJson("tracker/validations/event-data-delete.json"); + params.setImportStrategy(DELETE); - ImportReport importReportDelete = trackerImportService.importTracker(paramsDelete); + ImportReport importReportDelete = + trackerImportService.importTracker(params, deleteTrackerObjects); assertNoErrors(importReportDelete); assertEquals(1, importReportDelete.getStats().getDeleted()); } private ImportReport createEvent(String jsonPayload) throws IOException { // Given - TrackerImportParams trackerBundleParams = fromJson(jsonPayload); - trackerBundleParams.setImportStrategy(CREATE_AND_UPDATE); + TrackerObjects trackerObjects = fromJson(jsonPayload); + TrackerImportParams params = new TrackerImportParams(); + params.setImportStrategy(CREATE_AND_UPDATE); // When - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); // Then assertNoErrors(importReport); return importReport; diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java index f870d492eb17..250bf1a50eb4 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java @@ -63,6 +63,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -127,9 +128,11 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_enrollments-data.json"))); manager.flush(); } @@ -217,14 +220,14 @@ private void setupMetadata() { @Test void testNoWriteAccessToProgramStage() throws IOException { setupMetadata(); - TrackerImportParams trackerBundleParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/events_error-no-programStage-access.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_3); - trackerBundleParams.setUser(user); + params.setUserId(user.getUid()); user.addOrganisationUnit(organisationUnitA); manager.update(user); - trackerBundleParams.setUser(user); - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1095, ValidationCode.E1096); } @@ -232,16 +235,15 @@ void testNoWriteAccessToProgramStage() throws IOException { @Test void testNoUncompleteEventAuth() throws IOException { setupMetadata(); - TrackerImportParams params = fromJson("tracker/validations/events_error-no-uncomplete.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events_error-no-uncomplete.json"); + TrackerImportParams params = new TrackerImportParams(); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); // Change just inserted Event to status COMPLETED... Event zwwuwNp6gVd = programStageServiceInstance.getEvent("ZwwuwNp6gVd"); zwwuwNp6gVd.setStatus(EventStatus.COMPLETED); manager.update(zwwuwNp6gVd); - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/events_error-no-uncomplete.json"); programA.setPublicAccess(AccessStringHelper.FULL); manager.update(programA); programStageA.setPublicAccess(AccessStringHelper.FULL); @@ -253,9 +255,9 @@ void testNoUncompleteEventAuth() throws IOException { manager.update(user); manager.flush(); manager.clear(); - trackerBundleParams.setUserId(user.getUid()); - trackerBundleParams.setImportStrategy(TrackerImportStrategy.UPDATE); - importReport = trackerImportService.importTracker(trackerBundleParams); + params.setUserId(user.getUid()); + params.setImportStrategy(TrackerImportStrategy.UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1083); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java index f8bc741c6541..dcf6a55beaba 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java @@ -35,6 +35,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -50,32 +51,33 @@ protected void initTest() throws IOException { @Test void testUniqueFailInOrgUnit() throws IOException { - TrackerImportParams trackerImportParams = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data_in_country.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); - trackerImportParams = + trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data_in_country.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); - trackerImportParams = - fromJson("tracker/validations/te-program_with_tea_unique_data_in_region.json"); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data_in_region.json"); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testUniqueFail() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - trackerImportParams = fromJson("tracker/validations/te-program_with_tea_unique_data2.json"); + trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data2.json"); - importReport = trackerImportService.importTracker(trackerImportParams); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1064); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java index ca60d780448d..f13c725ba1a7 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java @@ -45,6 +45,7 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -80,9 +81,9 @@ void testTrackedEntityProgramAttributeFileResourceValue() throws IOException { File file = File.createTempFile("file-resource", "test"); fileResourceService.saveFileResource(fileResource, file); assertFalse(fileResource.isAssigned()); - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_fileresource_data.json"); - trackerImportService.importTracker(trackerImportParams); + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(1, trackedEntities.size()); TrackedEntity trackedEntity = trackedEntities.get(0); @@ -106,9 +107,9 @@ void testFileAlreadyAssign() throws IOException { File file = File.createTempFile("file-resource", "test"); fileResourceService.saveFileResource(fileResource, file); assertFalse(fileResource.isAssigned()); - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_fileresource_data.json"); - trackerImportService.importTracker(trackerImportParams); + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(1, trackedEntities.size()); TrackedEntity trackedEntity = trackedEntities.get(0); @@ -117,17 +118,18 @@ void testFileAlreadyAssign() throws IOException { assertEquals(1, attributeValues.size()); fileResource = fileResourceService.getFileResource(fileResource.getUid()); assertTrue(fileResource.isAssigned()); - trackerImportParams = - fromJson("tracker/validations/te-program_with_tea_fileresource_data2.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/validations/te-program_with_tea_fileresource_data2.json"); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1009); } @Test void testNoFileRef() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_fileresource_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1084); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -136,40 +138,44 @@ void testNoFileRef() throws IOException { @Test void testTeaMaxTextValueLength() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_too_long_text_value.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1077); } @Test void testTeaInvalidFormat() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_invalid_format_value.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1085); } @Test void testTeaInvalidImage() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_invalid_image_value.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1085, ValidationCode.E1007); } @Test void testTeaIsNull() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_invalid_value_isnull.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1076); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java index a32b48287d1c..d5f62d263553 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java @@ -45,6 +45,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.junit.jupiter.api.Test; @@ -66,47 +67,53 @@ protected void initTest() throws IOException { @Test void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-with_invalid_option_value.json"); + TrackerObjects trackerObjects = + fromJson("tracker/validations/te-with_invalid_option_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1125); } @Test void successValidationWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-with_valid_option_value.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-with_valid_option_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void failValidationWhenTrackedEntityAttributesHaveSameUniqueValues() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-with_unique_attributes.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-with_unique_attributes.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasErrors(importReport, 2, ValidationCode.E1064); } @Test void testTeValidationOkAll() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void testNoCreateTeiAccessOutsideCaptureScopeOu() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_7); - params.setUser(user); + params.setUserId(user.getUid()); params.setAtomicMode(AtomicMode.OBJECT); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1000); assertEquals(2, importReport.getStats().getCreated()); assertEquals(1, importReport.getStats().getIgnored()); @@ -114,8 +121,9 @@ void testNoCreateTeiAccessOutsideCaptureScopeOu() throws IOException { @Test void testUpdateAccessInSearchScopeOu() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertEquals(3, importReport.getStats().getCreated()); // For some reason teiSearchOrgunits is not created properly from @@ -125,29 +133,30 @@ void testUpdateAccessInSearchScopeOu() throws IOException { user.setTeiSearchOrganisationUnits(new HashSet<>(user.getDataViewOrganisationUnits())); userService.updateUser(user); dbmsManager.clearSession(); - params = fromJson("tracker/validations/te-data_with_different_ou.json"); + trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); user = userService.getUser(USER_8); - params.setUser(user); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); params.setAtomicMode(AtomicMode.OBJECT); - importReport = trackerImportService.importTracker(params); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertEquals(3, importReport.getStats().getUpdated()); } @Test void testNoUpdateAccessOutsideSearchScopeOu() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertEquals(3, importReport.getStats().getCreated()); dbmsManager.clearSession(); - params = fromJson("tracker/validations/te-data_with_different_ou.json"); + trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); User user = userService.getUser(USER_7); - params.setUser(user); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); params.setAtomicMode(AtomicMode.OBJECT); - importReport = trackerImportService.importTracker(params); + importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1003); assertEquals(2, importReport.getStats().getUpdated()); assertEquals(1, importReport.getStats().getIgnored()); @@ -155,81 +164,89 @@ void testNoUpdateAccessOutsideSearchScopeOu() throws IOException { @Test void testNoWriteAccessInAcl() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_ok.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_ok.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_1); - params.setUser(user); + params.setUserId(user.getUid()); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 13, ValidationCode.E1001); } @Test void testWriteAccessInAclViaUserGroup() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_ok.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_ok.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_3); params.setUserId(user.getUid()); - params.setUser(user); + params.setUserId(user.getUid()); user.setPassword("user4password"); injectSecurityContext(user); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testGeoOk() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_error_geo-ok.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_error_geo-ok.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testTeAttrNonExistentAttr() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_error_attr-non-existing.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 2, ValidationCode.E1006); } @Test void testDeleteCascadeEnrollments() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_te-data.json"); - assertNoErrors(trackerImportService.importTracker(params)); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_te-data.json"); + TrackerImportParams params = new TrackerImportParams(); + assertNoErrors(trackerImportService.importTracker(params, trackerObjects)); importEnrollments(); manager.flush(); manager.clear(); - params = fromJson("tracker/validations/enrollments_te_te-data.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_te-data.json"); User user2 = userService.getUser(USER_4); - params.setUser(user2); + params.setUserId(user2.getUid()); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 2, ValidationCode.E1100); } @Test void testTeDeleteOk() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - TrackerImportParams paramsDelete = fromJson("tracker/validations/te-data-delete.json"); - paramsDelete.setImportStrategy(TrackerImportStrategy.DELETE); + TrackerObjects deleteTrackerObjects = fromJson("tracker/validations/te-data-delete.json"); + params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReportDelete = trackerImportService.importTracker(paramsDelete); + ImportReport importReportDelete = + trackerImportService.importTracker(params, deleteTrackerObjects); assertNoErrors(importReportDelete); assertEquals(1, importReportDelete.getStats().getDeleted()); } protected void importEnrollments() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } } diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java index d0a0837fe6bf..62d15b1863a8 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java @@ -28,7 +28,7 @@ package org.hisp.dhis.webapi.controller.tracker.imports; import org.hisp.dhis.web.HttpStatus; -import org.hisp.dhis.webapi.DhisControllerConvenienceTest; +import org.hisp.dhis.webapi.DhisControllerIntegrationTest; import org.junit.jupiter.api.Test; /** @@ -37,7 +37,7 @@ * * @author Jan Bernitt */ -class TrackerImportControllerTest extends DhisControllerConvenienceTest { +class TrackerImportControllerTest extends DhisControllerIntegrationTest { @Test void shouldSucceedWhenAllValidParametersArePassed() { assertWebMessage( diff --git a/dhis-2/dhis-web-api/pom.xml b/dhis-2/dhis-web-api/pom.xml index 6a0c8894417b..10823ccd10f0 100644 --- a/dhis-2/dhis-web-api/pom.xml +++ b/dhis-2/dhis-web-api/pom.xml @@ -214,10 +214,6 @@ org.hisp.dhis.rules rule-engine - - org.hisp.dhis - dhis-support-artemis - org.hisp.dhis dhis-service-acl diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java index 6ab8f2d79861..b60d474a7065 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; import lombok.AllArgsConstructor; @@ -54,7 +55,7 @@ @NoArgsConstructor @AllArgsConstructor @JsonDeserialize(converter = BodyConverter.class) -class Body { +class Body implements Serializable { /** Tracked entities to import. */ @JsonProperty @Builder.Default private final List trackedEntities = new ArrayList<>(); diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java deleted file mode 100644 index 50ecec4368ad..000000000000 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.webapi.controller.tracker.imports; - -import javax.annotation.Nonnull; -import lombok.RequiredArgsConstructor; -import org.hisp.dhis.artemis.MessageManager; -import org.hisp.dhis.artemis.Topics; -import org.hisp.dhis.security.AuthenticationSerializer; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.job.TrackerMessage; -import org.hisp.dhis.tracker.imports.report.ImportReport; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Component; - -/** - * @author Luca Cambi - */ -@Component -@RequiredArgsConstructor -public class TrackerAsyncImporter { - @Nonnull private final MessageManager messageManager; - - public ImportReport importTracker( - TrackerImportParams params, Authentication authentication, String uid) { - TrackerMessage trackerMessage = - TrackerMessage.builder() - .trackerImportParams(params) - .authentication(AuthenticationSerializer.serialize(authentication)) - .uid(uid) - .build(); - - messageManager.sendQueue(Topics.TRACKER_IMPORT_JOB_TOPIC_NAME, trackerMessage); - - return null; // empty report is not - // returned - // in async creation - } -} diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java index 2610b91c51ac..e882355a4df9 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java @@ -32,28 +32,33 @@ import static org.hisp.dhis.webapi.utils.ContextUtils.setNoStore; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.ObjectOutputStream; import java.util.Deque; import java.util.List; import java.util.Optional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; -import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.DhisApiVersion; import org.hisp.dhis.common.OpenApi; import org.hisp.dhis.commons.util.StreamUtils; import org.hisp.dhis.dxf2.webmessage.WebMessage; +import org.hisp.dhis.feedback.ConflictException; import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.scheduling.JobConfiguration; +import org.hisp.dhis.scheduling.JobConfigurationService; +import org.hisp.dhis.scheduling.JobSchedulerService; import org.hisp.dhis.scheduling.JobType; import org.hisp.dhis.system.notification.Notification; import org.hisp.dhis.system.notification.Notifier; import org.hisp.dhis.tracker.imports.TrackerBundleReportMode; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.job.TrackerJobWebMessageResponse; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.hisp.dhis.user.CurrentUser; @@ -65,7 +70,7 @@ import org.locationtech.jts.io.ParseException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.MimeType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -87,33 +92,60 @@ public class TrackerImportController { static final String TRACKER_JOB_ADDED = "Tracker job added"; - private final TrackerSyncImporter syncImporter; - - private final TrackerAsyncImporter asyncImporter; - private final TrackerImportService trackerImportService; private final CsvService csvEventService; private final Notifier notifier; + private final JobSchedulerService jobSchedulerService; + + private final JobConfigurationService jobConfigurationService; + @PostMapping(value = "", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) @ResponseBody public WebMessage asyncPostJsonTracker( HttpServletRequest request, RequestParams requestParams, @CurrentUser User currentUser, - @RequestBody Body body) { - String jobId = CodeGenerator.generateUid(); + @RequestBody Body body) + throws ConflictException, NotFoundException, IOException { TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams( - true, jobId, currentUser.getUid(), requestParams, body); + TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), requestParams); + TrackerObjects trackerObjects = + TrackerImportParamsMapper.trackerObjects(body, trackerImportParams.getIdSchemes()); + + return startAsyncTracker( + trackerImportParams, + MimeType.valueOf("application/json"), + trackerObjects, + currentUser, + request); + } - asyncImporter.importTracker( - trackerImportParams, SecurityContextHolder.getContext().getAuthentication(), jobId); + private WebMessage startAsyncTracker( + TrackerImportParams params, + MimeType contentType, + TrackerObjects trackerObjects, + User user, + HttpServletRequest request) + throws IOException, ConflictException, NotFoundException { + JobConfiguration config = new JobConfiguration(JobType.TRACKER_IMPORT_JOB); + config.setExecutedBy(user.getUid()); + config.setJobParameters(params); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); - String location = ContextUtils.getRootPath(request) + "/tracker/jobs/" + jobId; + oos.writeObject(trackerObjects); + + oos.flush(); + oos.close(); + InputStream is = new ByteArrayInputStream(baos.toByteArray()); + + jobSchedulerService.executeNow(jobConfigurationService.create(config, contentType, is)); + String jobId = config.getUid(); + String location = ContextUtils.getRootPath(request) + "/tracker/jobs/" + jobId; return ok(TRACKER_JOB_ADDED) .setLocation("/tracker/jobs/" + jobId) .setResponse(TrackerJobWebMessageResponse.builder().id(jobId).location(location).build()); @@ -125,12 +157,13 @@ public WebMessage asyncPostJsonTracker( params = {"async=false"}) public ResponseEntity syncPostJsonTracker( RequestParams requestParams, @CurrentUser User currentUser, @RequestBody Body body) { - String jobId = CodeGenerator.generateUid(); - TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams( - false, jobId, currentUser.getUid(), requestParams, body); - - ImportReport importReport = syncImporter.importTracker(trackerImportParams); + TrackerImportParams params = + TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), requestParams); + TrackerObjects trackerObjects = + TrackerImportParamsMapper.trackerObjects(body, params.getIdSchemes()); + ImportReport importReport = + trackerImportService.buildImportReport( + trackerImportService.importTracker(params, trackerObjects), params.getReportMode()); ResponseEntity.BodyBuilder builder = importReport.getStatus() == Status.ERROR @@ -150,26 +183,25 @@ public WebMessage asyncPostCsvTracker( RequestParams importRequest, @CurrentUser User currentUser, @RequestParam(required = false, defaultValue = "true") boolean skipFirst) - throws IOException, ParseException { + throws IOException, ParseException, ConflictException, NotFoundException { InputStream inputStream = StreamUtils.wrapAndCheckCompressionFormat(request.getInputStream()); List events = csvEventService.read(inputStream, skipFirst); Body body = Body.builder().events(events).build(); - String jobId = CodeGenerator.generateUid(); TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams( - true, jobId, currentUser.getUid(), importRequest, body); + TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), importRequest); - asyncImporter.importTracker( - trackerImportParams, SecurityContextHolder.getContext().getAuthentication(), jobId); - - String location = ContextUtils.getRootPath(request) + "/tracker/jobs/" + jobId; + TrackerObjects trackerObjects = + TrackerImportParamsMapper.trackerObjects(body, trackerImportParams.getIdSchemes()); - return ok(TRACKER_JOB_ADDED) - .setLocation("/tracker/jobs/" + jobId) - .setResponse(TrackerJobWebMessageResponse.builder().id(jobId).location(location).build()); + return startAsyncTracker( + trackerImportParams, + MimeType.valueOf("application/csv"), + trackerObjects, + currentUser, + request); } @PostMapping( @@ -189,12 +221,14 @@ public ResponseEntity syncPostCsvTracker( List events = csvEventService.read(inputStream, skipFirst); Body body = Body.builder().events(events).build(); - String jobId = CodeGenerator.generateUid(); TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams( - false, jobId, currentUser.getUid(), importRequest, body); - - ImportReport importReport = syncImporter.importTracker(trackerImportParams); + TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), importRequest); + TrackerObjects trackerObjects = + TrackerImportParamsMapper.trackerObjects(body, trackerImportParams.getIdSchemes()); + ImportReport importReport = + trackerImportService.buildImportReport( + trackerImportService.importTracker(trackerImportParams, trackerObjects), + trackerImportParams.getReportMode()); ResponseEntity.BodyBuilder builder = importReport.getStatus() == Status.ERROR @@ -221,6 +255,6 @@ public ImportReport getJobReport( return Optional.ofNullable(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)) .map(report -> trackerImportService.buildImportReport((ImportReport) report, reportMode)) - .orElseThrow(() -> new NotFoundException(JobConfiguration.class, uid)); + .orElseThrow(() -> new NotFoundException("Summary for job " + uid + " does not exist")); } } diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java new file mode 100644 index 000000000000..518fcf6b72fe --- /dev/null +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.webapi.controller.tracker.imports; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.util.function.Consumer; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.hisp.dhis.fileresource.FileResource; +import org.hisp.dhis.fileresource.FileResourceService; +import org.hisp.dhis.scheduling.Job; +import org.hisp.dhis.scheduling.JobConfiguration; +import org.hisp.dhis.scheduling.JobProgress; +import org.hisp.dhis.scheduling.JobType; +import org.hisp.dhis.system.notification.Notifier; +import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.report.ImportReport; +import org.hisp.dhis.tracker.imports.report.Stats; +import org.hisp.dhis.tracker.imports.report.Status; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class TrackerImportJob implements Job { + private final TrackerImportService trackerImportService; + private final FileResourceService fileResourceService; + private final Notifier notifier; + + @Override + public JobType getJobType() { + return JobType.TRACKER_IMPORT_JOB; + } + + @Override + public void execute(JobConfiguration config, JobProgress progress) { + progress.startingProcess("Tracker import started"); + TrackerImportParams params = (TrackerImportParams) config.getJobParameters(); + progress.startingStage("Loading file resource"); + FileResource data = + progress.runStage(() -> fileResourceService.getFileResource(config.getUid())); + progress.startingStage("Loading file content"); + try (InputStream input = + progress.runStage(() -> fileResourceService.getFileResourceContent(data))) { + ImportReport report = + trackerImportService.importTracker(params, toTrackerObjects(input), progress); + if (report == null) { + progress.failedProcess("Import failed, no summary available"); + return; + } + notifier.addJobSummary(config, report, ImportReport.class); + Stats stats = report.getStats(); + Consumer endProcess = + report.getStatus() == Status.ERROR ? progress::failedProcess : progress::completedProcess; + endProcess.accept( + "Import complete with status %s, %d created, %d updated, %d deleted, %d ignored" + .formatted( + report.getStatus(), + stats.getCreated(), + stats.getUpdated(), + stats.getDeleted(), + stats.getIgnored())); + } catch (Exception ex) { + progress.failedProcess(ex); + } + } + + private TrackerObjects toTrackerObjects(InputStream input) + throws IOException, ClassNotFoundException { + ObjectInputStream ois = new ObjectInputStream(input); + return (TrackerObjects) ois.readObject(); + } +} diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java index 5eb64ff0609d..e1de076a1d4b 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java @@ -27,11 +27,10 @@ */ package org.hisp.dhis.webapi.controller.tracker.imports; -import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobType; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.mapstruct.factory.Mappers; public class TrackerImportParamsMapper { @@ -46,10 +45,19 @@ public class TrackerImportParamsMapper { private static final RelationshipMapper RELATIONSHIP_MAPPER = Mappers.getMapper(RelationshipMapper.class); + public static TrackerObjects trackerObjects(Body body, TrackerIdSchemeParams idSchemeParams) { + return TrackerObjects.builder() + .trackedEntities( + TRACKED_ENTITY_MAPPER.fromCollection(body.getTrackedEntities(), idSchemeParams)) + .enrollments(ENROLLMENT_MAPPER.fromCollection(body.getEnrollments(), idSchemeParams)) + .events(EVENT_MAPPER.fromCollection(body.getEvents(), idSchemeParams)) + .relationships(RELATIONSHIP_MAPPER.fromCollection(body.getRelationships(), idSchemeParams)) + .build(); + } + private TrackerImportParamsMapper() {} - public static TrackerImportParams trackerImportParams( - boolean isAsync, String jobId, String userId, RequestParams request, Body params) { + public static TrackerImportParams trackerImportParams(String userId, RequestParams request) { TrackerIdSchemeParam defaultIdSchemeParam = request.getIdScheme(); TrackerIdSchemeParams idSchemeParams = TrackerIdSchemeParams.builder() @@ -77,21 +85,7 @@ public static TrackerImportParams trackerImportParams( .skipSideEffects(request.isSkipSideEffects()) .skipRuleEngine(request.isSkipRuleEngine()) .reportMode(request.getReportMode()) - .userId(userId) - .trackedEntities( - TRACKED_ENTITY_MAPPER.fromCollection(params.getTrackedEntities(), idSchemeParams)) - .enrollments(ENROLLMENT_MAPPER.fromCollection(params.getEnrollments(), idSchemeParams)) - .events(EVENT_MAPPER.fromCollection(params.getEvents(), idSchemeParams)) - .relationships( - RELATIONSHIP_MAPPER.fromCollection(params.getRelationships(), idSchemeParams)); - - if (!isAsync) { - JobConfiguration jobConfiguration = - new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, userId); - jobConfiguration.setUid(jobId); - paramsBuilder.jobConfiguration(jobConfiguration); - } - + .userId(userId); return paramsBuilder.build(); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerJobWebMessageResponse.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerJobWebMessageResponse.java similarity index 92% rename from dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerJobWebMessageResponse.java rename to dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerJobWebMessageResponse.java index 630f30f46e4a..3251757dc7ba 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerJobWebMessageResponse.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerJobWebMessageResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2022, University of Oslo + * Copyright (c) 2004-2023, University of Oslo * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,16 +25,13 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.hisp.dhis.tracker.imports.job; +package org.hisp.dhis.webapi.controller.tracker.imports; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Data; import org.hisp.dhis.webmessage.WebMessageResponse; -/** - * @author Morten Olav Hansen - */ @Data @Builder public class TrackerJobWebMessageResponse implements WebMessageResponse { diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java index acb52aa69679..67610dbe6e05 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java @@ -29,6 +29,7 @@ import static java.util.Collections.singletonList; import static org.hamcrest.Matchers.hasSize; +import static org.hisp.dhis.scheduling.JobType.TRACKER_IMPORT_JOB; import static org.hisp.dhis.webapi.controller.tracker.imports.TrackerImportController.TRACKER_JOB_ADDED; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -50,7 +51,8 @@ import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.render.DefaultRenderService; import org.hisp.dhis.render.RenderService; -import org.hisp.dhis.scheduling.JobType; +import org.hisp.dhis.scheduling.JobConfigurationService; +import org.hisp.dhis.scheduling.JobSchedulerService; import org.hisp.dhis.schema.SchemaService; import org.hisp.dhis.system.notification.Notification; import org.hisp.dhis.system.notification.Notifier; @@ -58,7 +60,6 @@ import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.report.Status; -import org.hisp.dhis.tracker.imports.report.TimingsStats; import org.hisp.dhis.tracker.imports.report.ValidationReport; import org.hisp.dhis.webapi.controller.CrudControllerAdvice; import org.hisp.dhis.webapi.controller.tracker.ControllerSupport; @@ -85,14 +86,14 @@ class TrackerImportControllerTest { @Mock private DefaultTrackerImportService trackerImportService; - @Mock private TrackerSyncImporter syncImporter; - - @Mock private TrackerAsyncImporter asyncImporter; - @Mock private CsvService csvEventService; @Mock private Notifier notifier; + @Mock private JobSchedulerService jobSchedulerService; + + @Mock private JobConfigurationService jobConfigurationService; + private RenderService renderService; @BeforeEach @@ -106,7 +107,11 @@ public void setUp() { // Controller under test final TrackerImportController controller = new TrackerImportController( - syncImporter, asyncImporter, trackerImportService, csvEventService, notifier); + trackerImportService, + csvEventService, + notifier, + jobSchedulerService, + jobConfigurationService); mockMvc = MockMvcBuilders.standaloneSetup(controller) @@ -140,19 +145,17 @@ void verifyAsyncForCsv() throws Exception { .andExpect(content().contentType("application/json")); verify(csvEventService).read(any(), eq(true)); - verify(asyncImporter).importTracker(any(), any(), any()); } @Test void verifySyncResponseShouldBeOkWhenImportReportStatusIsOk() throws Exception { // When - when(syncImporter.importTracker(any())) + when(trackerImportService.buildImportReport(any(), any())) .thenReturn( ImportReport.withImportCompleted( Status.OK, PersistenceReport.emptyReport(), ValidationReport.emptyReport(), - new TimingsStats(), new HashMap<>())); // Then @@ -170,7 +173,7 @@ void verifySyncResponseShouldBeOkWhenImportReportStatusIsOk() throws Exception { .getResponse() .getContentAsString(); - verify(syncImporter).importTracker(any()); + verify(trackerImportService).importTracker(any(), any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -182,13 +185,12 @@ void verifySyncResponseShouldBeOkWhenImportReportStatusIsOk() throws Exception { @Test void verifySyncResponseForCsvShouldBeOkWhenImportReportStatusIsOk() throws Exception { // When - when(syncImporter.importTracker(any())) + when(trackerImportService.buildImportReport(any(), any())) .thenReturn( ImportReport.withImportCompleted( Status.OK, PersistenceReport.emptyReport(), ValidationReport.emptyReport(), - new TimingsStats(), new HashMap<>())); // Then @@ -206,7 +208,7 @@ void verifySyncResponseForCsvShouldBeOkWhenImportReportStatusIsOk() throws Excep .getContentAsString(); verify(csvEventService).read(any(), eq(true)); - verify(syncImporter).importTracker(any()); + verify(trackerImportService).importTracker(any(), any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -219,10 +221,8 @@ void verifySyncResponseForCsvShouldBeOkWhenImportReportStatusIsOk() throws Excep void verifySyncResponseShouldBeConflictWhenImportReportStatusIsError() throws Exception { String errorMessage = "errorMessage"; // When - when(syncImporter.importTracker(any())) - .thenReturn( - ImportReport.withError( - "errorMessage", ValidationReport.emptyReport(), new TimingsStats())); + when(trackerImportService.buildImportReport(any(), any())) + .thenReturn(ImportReport.withError(errorMessage, ValidationReport.emptyReport())); // Then String contentAsString = @@ -239,7 +239,7 @@ void verifySyncResponseShouldBeConflictWhenImportReportStatusIsError() throws Ex .getResponse() .getContentAsString(); - verify(syncImporter).importTracker(any()); + verify(trackerImportService).importTracker(any(), any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -252,10 +252,8 @@ void verifySyncResponseShouldBeConflictWhenImportReportStatusIsError() throws Ex void verifySyncResponseForCsvShouldBeConflictWhenImportReportStatusIsError() throws Exception { String errorMessage = "errorMessage"; // When - when(syncImporter.importTracker(any())) - .thenReturn( - ImportReport.withError( - "errorMessage", ValidationReport.emptyReport(), new TimingsStats())); + when(trackerImportService.buildImportReport(any(), any())) + .thenReturn(ImportReport.withError(errorMessage, ValidationReport.emptyReport())); // Then String contentAsString = @@ -272,7 +270,7 @@ void verifySyncResponseForCsvShouldBeConflictWhenImportReportStatusIsError() thr .getContentAsString(); verify(csvEventService).read(any(), eq(true)); - verify(syncImporter).importTracker(any()); + verify(trackerImportService).importTracker(any(), any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -285,7 +283,7 @@ void verifySyncResponseForCsvShouldBeConflictWhenImportReportStatusIsError() thr void verifyShouldFindJob() throws Exception { String uid = CodeGenerator.generateUid(); // When - when(notifier.getNotificationsByJobId(JobType.TRACKER_IMPORT_JOB, uid)) + when(notifier.getNotificationsByJobId(TRACKER_IMPORT_JOB, uid)) .thenReturn(new LinkedList<>(singletonList(new Notification()))); // Then @@ -305,7 +303,7 @@ void verifyShouldFindJob() throws Exception { .getResponse() .getContentAsString(); - verify(notifier).getNotificationsByJobId(JobType.TRACKER_IMPORT_JOB, uid); + verify(notifier).getNotificationsByJobId(TRACKER_IMPORT_JOB, uid); } @Test @@ -317,11 +315,10 @@ void verifyShouldFindJobReport() throws Exception { Status.OK, PersistenceReport.emptyReport(), ValidationReport.emptyReport(), - new TimingsStats(), new HashMap<>()); // When - when(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)).thenReturn(importReport); + when(notifier.getJobSummaryByJobId(TRACKER_IMPORT_JOB, uid)).thenReturn(importReport); when(trackerImportService.buildImportReport(any(), any())).thenReturn(importReport); @@ -340,7 +337,7 @@ void verifyShouldFindJobReport() throws Exception { .getResponse() .getContentAsString(); - verify(notifier).getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid); + verify(notifier).getJobSummaryByJobId(TRACKER_IMPORT_JOB, uid); verify(trackerImportService).buildImportReport(any(), any()); try { @@ -355,7 +352,7 @@ void verifyShouldThrowWhenJobReportNotFound() throws Exception { String uid = CodeGenerator.generateUid(); // When - when(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)).thenReturn(null); + when(notifier.getJobSummaryByJobId(TRACKER_IMPORT_JOB, uid)).thenReturn(null); // Then mockMvc diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java index 63e8c827f19e..8cb802fe993d 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java @@ -63,8 +63,7 @@ void testValidationMode() { e -> { RequestParams requestParams = RequestParams.builder().validationMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getValidationMode(), is(e)); }); } @@ -76,8 +75,7 @@ void testImportMode() { e -> { RequestParams requestParams = RequestParams.builder().importMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getImportMode(), is(e)); }); } @@ -89,8 +87,7 @@ void testAtomicMode() { e -> { RequestParams requestParams = RequestParams.builder().atomicMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getAtomicMode(), is(e)); }); } @@ -102,8 +99,7 @@ void testFlushMode() { e -> { RequestParams requestParams = RequestParams.builder().flushMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getFlushMode(), is(e)); }); } @@ -115,8 +111,7 @@ void testImportStrategy() { e -> { RequestParams requestParams = RequestParams.builder().importStrategy(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getImportStrategy(), is(e)); }); } @@ -126,8 +121,7 @@ void testIdSchemeUsingIdSchemeName() { RequestParams requestParams = RequestParams.builder().idScheme(TrackerIdSchemeParam.NAME).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); TrackerIdSchemeParam expected = TrackerIdSchemeParam.NAME; assertEquals(expected, params.getIdSchemes().getIdScheme()); @@ -144,8 +138,7 @@ void testIdSchemeUsingIdSchemeAttribute() { RequestParams requestParams = RequestParams.builder().idScheme(TrackerIdSchemeParam.ofAttribute("WSiOAALYocA")).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); TrackerIdSchemeParam expected = TrackerIdSchemeParam.ofAttribute("WSiOAALYocA"); assertEquals(expected, params.getIdSchemes().getIdScheme()); @@ -164,8 +157,7 @@ void testOrgUnitIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().orgUnitIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getOrgUnitIdScheme().getIdScheme(), is(e.getIdScheme())); }); @@ -178,8 +170,7 @@ void testProgramIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().programIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getProgramIdScheme().getIdScheme(), is(e.getIdScheme())); }); @@ -192,8 +183,7 @@ void testProgramIdentifierUsingIdSchemeAttribute() { .programIdScheme(TrackerIdSchemeParam.ofAttribute("WSiOAALYocA")) .build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertEquals( TrackerIdSchemeParam.ofAttribute("WSiOAALYocA"), @@ -207,8 +197,7 @@ void testProgramStageIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().programStageIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getProgramStageIdScheme().getIdScheme(), is(e.getIdScheme())); @@ -222,8 +211,7 @@ void testDataElementIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().dataElementIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getDataElementIdScheme().getIdScheme(), is(e.getIdScheme())); @@ -238,8 +226,7 @@ void testCategoryOptionComboIdentifier() { RequestParams requestParams = RequestParams.builder().categoryOptionComboIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getCategoryOptionComboIdScheme().getIdScheme(), is(e.getIdScheme())); @@ -254,8 +241,7 @@ void testCategoryOptionIdentifier() { RequestParams requestParams = RequestParams.builder().categoryOptionIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getCategoryOptionIdScheme().getIdScheme(), is(e.getIdScheme())); diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java deleted file mode 100644 index 0d1fd39f68b8..000000000000 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.webapi.controller.tracker.imports; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import org.hisp.dhis.artemis.MessageManager; -import org.hisp.dhis.artemis.Topics; -import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobType; -import org.hisp.dhis.tracker.imports.TrackerBundleReportMode; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.job.TrackerMessage; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -@ExtendWith(MockitoExtension.class) -class TrackerImporterImplTest { - @InjectMocks TrackerAsyncImporter asyncImporter; - - @InjectMocks TrackerSyncImporter syncImporter; - - @Mock TrackerImportService trackerImportService; - - @Mock MessageManager messageManager; - - @Test - void shouldCreateReportSync() { - TrackerImportParams params = - TrackerImportParams.builder() - .jobConfiguration(new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, "userId")) - .reportMode(TrackerBundleReportMode.FULL) - .build(); - - syncImporter.importTracker(params); - - verify(trackerImportService).importTracker(params); - verify(trackerImportService).buildImportReport(any(), eq(TrackerBundleReportMode.FULL)); - } - - @Test - void shouldSendMessageToQueueAsync() { - ArgumentCaptor queueNameCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor trackerMessageCaptor = - ArgumentCaptor.forClass(TrackerMessage.class); - - doNothing() - .when(messageManager) - .sendQueue(queueNameCaptor.capture(), trackerMessageCaptor.capture()); - - TrackerImportParams params = - TrackerImportParams.builder() - .jobConfiguration(new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, "userId")) - .build(); - - asyncImporter.importTracker(params, null, ""); - - verify(trackerImportService, times(0)).importTracker(any()); - verify(messageManager).sendQueue(any(), any()); - assertEquals(Topics.TRACKER_IMPORT_JOB_TOPIC_NAME, queueNameCaptor.getValue()); - assertEquals(params, trackerMessageCaptor.getValue().getTrackerImportParams()); - } -} From bc2befccc341638152bea5a7bbd0da12b87dddbb Mon Sep 17 00:00:00 2001 From: Enrico Colasante Date: Tue, 14 Nov 2023 12:17:34 +0100 Subject: [PATCH 61/63] Revert "chore: Make async tracker importer use scheduler (#15597)" (#15682) This reverts commit 5cd719cfbc00c4ffa554b83aa5737626ad656175. --- .../org/hisp/dhis/scheduling/JobType.java | 3 +- .../HibernateJobConfigurationStore.java | 3 - .../dhis-service-tracker/pom.xml | 8 + .../imports/DefaultTrackerImportService.java | 225 ++++++++++++++---- .../dhis/tracker/imports/ParamsConverter.java | 15 +- .../tracker/imports/TrackerIdSchemeParam.java | 3 +- .../imports/TrackerIdSchemeParams.java | 3 +- .../imports/TrackerIdentifierCollector.java | 11 +- .../tracker/imports/TrackerImportParams.java | 60 ++++- .../tracker/imports/TrackerImportService.java | 22 +- .../bundle/DefaultTrackerBundleService.java | 10 +- .../imports/bundle/TrackerBundleService.java | 4 +- .../tracker/imports/domain/Attribute.java | 3 +- .../tracker/imports/domain/Coordinate.java | 3 +- .../tracker/imports/domain/DataValue.java | 3 +- .../tracker/imports/domain/Enrollment.java | 3 +- .../dhis/tracker/imports/domain/Event.java | 3 +- .../imports/domain/MetadataIdentifier.java | 3 +- .../dhis/tracker/imports/domain/Note.java | 3 +- .../tracker/imports/domain/Relationship.java | 3 +- .../imports/domain/RelationshipItem.java | 3 +- .../tracker/imports/domain/TrackedEntity.java | 3 +- .../dhis/tracker/imports/domain/User.java | 3 +- .../imports/job/TrackerImportThread.java | 62 +++++ .../job}/TrackerJobWebMessageResponse.java | 7 +- .../tracker/imports/job/TrackerMessage.java | 62 +++++ .../imports/job/TrackerMessageManager.java | 89 +++++++ .../preheat/DefaultTrackerPreheatService.java | 13 +- .../preheat/TrackerPreheatService.java | 7 +- .../supplier/AbstractPreheatSupplier.java | 8 +- .../preheat/supplier/ClassBasedSupplier.java | 8 +- .../preheat/supplier/DefaultsSupplier.java | 4 +- .../DuplicateRelationshipSupplier.java | 6 +- .../preheat/supplier/EnrollmentSupplier.java | 4 +- ...nrollmentsWithAtLeastOneEventSupplier.java | 4 +- .../EventCategoryOptionComboSupplier.java | 6 +- .../EventProgramStageMapSupplier.java | 10 +- .../supplier/FileResourceSupplier.java | 13 +- .../supplier/OrgUnitValueTypeSupplier.java | 10 +- .../preheat/supplier/PeriodTypeSupplier.java | 4 +- .../preheat/supplier/PreheatSupplier.java | 5 +- .../supplier/ProgramOrgUnitsSupplier.java | 4 +- .../supplier/ProgramOwnerSupplier.java | 8 +- .../TrackedEntityEnrollmentSupplier.java | 8 +- .../supplier/UniqueAttributesSupplier.java | 23 +- .../preheat/supplier/UserSupplier.java | 8 +- .../supplier/UsernameValueTypeSupplier.java | 8 +- .../strategy/AbstractSchemaStrategy.java | 6 +- .../strategy/ClassBasedSupplierStrategy.java | 3 +- .../supplier/strategy/EnrollmentStrategy.java | 4 +- .../supplier/strategy/EventStrategy.java | 4 +- .../supplier/strategy/NoteStrategy.java | 4 +- .../strategy/RelationshipStrategy.java | 4 +- .../strategy/TrackerEntityStrategy.java | 4 +- .../tracker/imports/report/ImportReport.java | 15 +- .../tracker/imports/report/TimingsStats.java | 153 ++++++++++++ .../TrackerIdentifierCollectorTest.java | 46 ++-- .../bundle/TrackerImporterServiceTest.java | 40 ++-- .../DefaultTrackerPreheatServiceTest.java | 16 +- .../supplier/ClassBasedSupplierTest.java | 10 +- .../DuplicateRelationshipSupplierTest.java | 8 +- .../supplier/EnrollmentSupplierTest.java | 6 +- .../EventCategoryOptionComboSupplierTest.java | 48 ++-- .../supplier/FileResourceSupplierTest.java | 29 ++- .../OrgUnitValueTypeSupplierTest.java | 29 ++- .../supplier/PeriodTypeSupplierTest.java | 4 +- .../supplier/UniqueAttributeSupplierTest.java | 26 +- .../preheat/supplier/UserSupplierTest.java | 6 +- .../strategy/TrackerEntityStrategyTest.java | 8 +- .../imports/report/ImportReportTest.java | 4 +- .../report/TrackerBundleImportReportTest.java | 64 ++++- .../tracker/TrackerImportExportActions.java | 8 - .../tracker/AclEventExporterTest.java | 5 +- .../org/hisp/dhis/tracker/TrackerTest.java | 24 +- .../OrderAndPaginationExporterTest.java | 5 +- .../export/event/AclEventExporterTest.java | 5 +- .../export/event/EventExporterTest.java | 5 +- .../imports/AtomicModeIntegrationTest.java | 16 +- .../imports/TrackerImportParamsSerdeTest.java | 16 +- .../imports/bundle/EventDataValueTest.java | 37 +-- .../imports/bundle/LastUpdateImportTest.java | 33 +-- .../tracker/imports/bundle/OwnershipTest.java | 116 ++++----- .../bundle/RelationshipImportTest.java | 25 +- .../ReportSummaryDeleteIntegrationTest.java | 39 ++- .../bundle/ReportSummaryIntegrationTest.java | 141 +++++------ .../bundle/TrackedEntityAttributeTest.java | 13 +- .../TrackedEntityAttributeValueAuditTest.java | 15 +- .../TrackedEntityDataValueAuditTest.java | 8 +- ...dEntityProgramAttributeEncryptionTest.java | 2 - ...ntityProgramAttributeFileResourceTest.java | 2 - .../TrackedEntityProgramAttributeTest.java | 34 ++- .../bundle/TrackerBundleServiceTest.java | 9 +- .../bundle/TrackerEventBundleServiceTest.java | 16 +- .../TrackerProgramRuleBundleServiceTest.java | 9 +- .../TrackerSideEffectHandlerServiceTest.java | 2 - .../TrackerPreheatIdentifiersTest.java | 76 +++--- .../TrackerPreheatServiceIntegrationTest.java | 23 +- .../preheat/TrackerPreheatServiceTest.java | 46 ++-- .../ProgramRuleAssignActionTest.java | 22 +- .../imports/programrule/ProgramRuleTest.java | 87 +++---- .../EnrollmentAttrValidationTest.java | 64 ++--- .../EnrollmentImportValidationTest.java | 82 +++---- ...nrollmentSecurityImportValidationTest.java | 39 ++- .../validation/EventImportValidationTest.java | 90 +++---- .../EventSecurityImportValidationTest.java | 24 +- .../TeTaEncryptionValidationTest.java | 26 +- .../validation/TeTaValidationTest.java | 40 ++-- .../TrackedEntityImportValidationTest.java | 103 ++++---- .../imports/TrackerImportControllerTest.java | 4 +- dhis-2/dhis-web-api/pom.xml | 4 + .../controller/tracker/imports/Body.java | 3 +- .../tracker/imports/TrackerAsyncImporter.java | 64 +++++ .../imports/TrackerImportController.java | 108 +++------ .../tracker/imports/TrackerImportJob.java | 102 -------- .../imports/TrackerImportParamsMapper.java | 32 ++- .../tracker/imports/TrackerSyncImporter.java} | 43 ++-- .../imports/TrackerImportControllerTest.java | 57 ++--- .../TrackerImportParamsMapperTest.java | 42 ++-- .../imports/TrackerImporterImplTest.java | 98 ++++++++ 119 files changed, 1843 insertions(+), 1343 deletions(-) create mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java rename dhis-2/{dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports => dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job}/TrackerJobWebMessageResponse.java (92%) create mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java create mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java create mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java create mode 100644 dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java delete mode 100644 dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java rename dhis-2/{dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java => dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java} (63%) create mode 100644 dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java index 7b51389db2d9..7357c130c46c 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java @@ -206,7 +206,6 @@ public boolean isUsingNotifications() { || this == DATAVALUE_IMPORT || this == COMPLETE_DATA_SET_REGISTRATION_IMPORT || this == METADATA_IMPORT - || this == TRACKER_IMPORT_JOB || this == GEOJSON_IMPORT; } @@ -232,7 +231,7 @@ public boolean isUsingErrorNotification() { * the ready jobs per type is attempted to start in a single loop cycle */ public boolean isUsingContinuousExecution() { - return this == METADATA_IMPORT || this == TRACKER_IMPORT_JOB; + return this == METADATA_IMPORT; } public boolean hasJobParameters() { diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java index 44653469e464..be63df14bf74 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java @@ -29,7 +29,6 @@ import static java.lang.Math.max; import static java.util.stream.Collectors.toSet; -import static org.springframework.transaction.annotation.Propagation.REQUIRES_NEW; import java.util.List; import java.util.Set; @@ -46,7 +45,6 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; /** * @author Jan Bernitt @@ -244,7 +242,6 @@ public Stream getDueJobConfigurations(boolean includeWaiting) } @Override - @Transactional(propagation = REQUIRES_NEW) public boolean tryExecuteNow(@Nonnull String jobId) { // language=SQL String sql = diff --git a/dhis-2/dhis-services/dhis-service-tracker/pom.xml b/dhis-2/dhis-services/dhis-service-tracker/pom.xml index 542a8b642f0d..393e2d329c1a 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/pom.xml +++ b/dhis-2/dhis-services/dhis-service-tracker/pom.xml @@ -65,6 +65,10 @@ org.hisp.dhis.rules rule-engine + + org.springframework + spring-core + org.springframework spring-jdbc @@ -85,6 +89,10 @@ org.springframework spring-beans + + org.springframework.security + spring-security-core + org.projectlombok lombok diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java index b203d58bbc68..ccf754014a01 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java @@ -27,25 +27,35 @@ */ package org.hisp.dhis.tracker.imports; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.COMMIT_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREHEAT_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREPROCESS_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.PROGRAMRULE_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.TOTAL_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.VALIDATE_PROGRAMRULE_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.VALIDATION_OPS; + import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nonnull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.hisp.dhis.scheduling.JobProgress; +import org.hisp.dhis.system.notification.NotificationLevel; +import org.hisp.dhis.system.notification.Notifier; import org.hisp.dhis.tracker.TrackerType; import org.hisp.dhis.tracker.imports.bundle.TrackerBundle; import org.hisp.dhis.tracker.imports.bundle.TrackerBundleService; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.job.TrackerSideEffectDataBundle; import org.hisp.dhis.tracker.imports.preprocess.TrackerPreprocessService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.report.Status; +import org.hisp.dhis.tracker.imports.report.TimingsStats; import org.hisp.dhis.tracker.imports.report.TrackerTypeReport; import org.hisp.dhis.tracker.imports.report.ValidationReport; import org.hisp.dhis.tracker.imports.validation.ValidationResult; @@ -68,78 +78,144 @@ public class DefaultTrackerImportService implements TrackerImportService { @Nonnull private final TrackerUserService trackerUserService; - /* Import is not meant to be annotated with @Transactional. - * PreHeat and Commit phases are separated transactions, other - * phases do not need to be in a transaction. */ + @Nonnull private final Notifier notifier; + @Override - public ImportReport importTracker( - TrackerImportParams params, TrackerObjects trackerObjects, JobProgress jobProgress) { + public ImportReport importTracker(TrackerImportParams params) { User user = trackerUserService.getUser(params.getUserId()); + params.setUser(user); - jobProgress.startingStage("Running PreHeat"); - TrackerBundle trackerBundle = - jobProgress.runStage(() -> trackerBundleService.create(params, trackerObjects, user)); + TimingsStats opsTimer = new TimingsStats(); - jobProgress.startingStage("Calculating Payload Size"); - Map bundleSize = - jobProgress.runStage(() -> calculatePayloadSize(trackerBundle)); + startImport(params); - jobProgress.startingStage("Running PreProcess"); - jobProgress.runStage(() -> trackerPreprocessService.preprocess(trackerBundle)); + try { + TrackerBundle trackerBundle = preHeat(params, opsTimer); - jobProgress.startingStage("Running Validation"); - ValidationResult validationResult = jobProgress.runStage(() -> validateBundle(trackerBundle)); + Map bundleSize = calculatePayloadSize(trackerBundle); - ValidationReport validationReport = ValidationReport.fromResult(validationResult); + preProcess(opsTimer, trackerBundle); - if (!trackerBundle.isSkipRuleEngine() && !params.getImportStrategy().isDelete()) { - jobProgress.startingStage("Running Rule Engine"); - jobProgress.runStage(() -> trackerBundleService.runRuleEngine(trackerBundle)); - - jobProgress.startingStage("Running Rule Engine Validation"); - ValidationResult result = - jobProgress.runStage(() -> validationService.validateRuleEngine(trackerBundle)); - trackerBundle.setTrackedEntities(result.getTrackedEntities()); - trackerBundle.setEnrollments(result.getEnrollments()); - trackerBundle.setEvents(result.getEvents()); - trackerBundle.setRelationships(result.getRelationships()); - - validationReport = ValidationReport.merge(validationResult, result); - } + ValidationReport validationReport = validate(params, opsTimer, trackerBundle); + + if (exitOnError(validationReport, params)) { + return buildReportAndNotify(params, validationReport, opsTimer, bundleSize); + } + + PersistenceReport persistenceReport = commit(params, opsTimer, trackerBundle); + + postCommit(trackerBundle); + + ImportReport importReport = + ImportReport.withImportCompleted( + Status.OK, persistenceReport, validationReport, opsTimer.stopTimer(), bundleSize); - if (exitOnError(validationReport, params)) { - return ImportReport.withValidationErrors( - validationReport, bundleSize.values().stream().mapToInt(Integer::intValue).sum()); + endImport(params, importReport); + + return importReport; + } catch (Exception e) { + log.error("Exception thrown during import.", e); + + ImportReport report = + ImportReport.withError( + "Exception:" + e.getMessage(), ValidationReport.emptyReport(), opsTimer.stopTimer()); + + endImportWithError(params, report, e); + + return report; } + } + + private TrackerBundle preHeat(TrackerImportParams params, TimingsStats opsTimer) { + TrackerBundle trackerBundle = opsTimer.exec(PREHEAT_OPS, () -> preheatBundle(params)); + + notifyOps(params, PREHEAT_OPS, opsTimer); - jobProgress.startingStage("Commit Transaction"); - PersistenceReport persistenceReport = jobProgress.runStage(() -> commit(params, trackerBundle)); + return trackerBundle; + } + + private void preProcess(TimingsStats opsTimer, TrackerBundle trackerBundle) { + opsTimer.execVoid(PREPROCESS_OPS, () -> preProcessBundle(trackerBundle)); + } + + private ValidationReport validate( + TrackerImportParams params, TimingsStats opsTimer, TrackerBundle trackerBundle) { + ValidationResult validationResult = + opsTimer.exec(VALIDATION_OPS, () -> validateBundle(params, trackerBundle, opsTimer)); - jobProgress.startingStage("PostCommit"); - jobProgress.runStage(() -> trackerBundleService.postCommit(trackerBundle)); + if (!trackerBundle.isSkipRuleEngine() && !params.getImportStrategy().isDelete()) { + ValidationResult ruleEnginevalidationResult = execRuleEngine(params, opsTimer, trackerBundle); + + return ValidationReport.merge(validationResult, ruleEnginevalidationResult); + } - return ImportReport.withImportCompleted( - Status.OK, persistenceReport, validationReport, bundleSize); + return ValidationReport.fromResult(validationResult); } - private PersistenceReport commit(TrackerImportParams params, TrackerBundle trackerBundle) { + private PersistenceReport commit( + TrackerImportParams params, TimingsStats opsTimer, TrackerBundle trackerBundle) { + PersistenceReport persistenceReport; if (TrackerImportStrategy.DELETE == params.getImportStrategy()) { - return deleteBundle(trackerBundle); + persistenceReport = opsTimer.exec(COMMIT_OPS, () -> deleteBundle(trackerBundle)); } else { - return commitBundle(trackerBundle); + persistenceReport = opsTimer.exec(COMMIT_OPS, () -> commitBundle(trackerBundle)); } + + notifyOps(params, COMMIT_OPS, opsTimer); + return persistenceReport; + } + + private void postCommit(TrackerBundle trackerBundle) { + trackerBundleService.postCommit(trackerBundle); } - protected ValidationResult validateBundle(TrackerBundle bundle) { + protected ValidationResult validateBundle( + TrackerImportParams params, TrackerBundle bundle, TimingsStats opsTimer) { ValidationResult result = validationService.validate(bundle); bundle.setTrackedEntities(result.getTrackedEntities()); bundle.setEnrollments(result.getEnrollments()); bundle.setEvents(result.getEvents()); bundle.setRelationships(result.getRelationships()); + notifyOps(params, VALIDATION_OPS, opsTimer); + + return result; + } + + private ValidationResult execRuleEngine( + TrackerImportParams params, TimingsStats opsTimer, TrackerBundle bundle) { + opsTimer.execVoid(PROGRAMRULE_OPS, () -> trackerBundleService.runRuleEngine(bundle)); + + notifyOps(params, PROGRAMRULE_OPS, opsTimer); + + ValidationResult result = + opsTimer.exec(VALIDATE_PROGRAMRULE_OPS, () -> validationService.validateRuleEngine(bundle)); + bundle.setTrackedEntities(result.getTrackedEntities()); + bundle.setEnrollments(result.getEnrollments()); + bundle.setEvents(result.getEvents()); + bundle.setRelationships(result.getRelationships()); + + notifyOps(params, VALIDATE_PROGRAMRULE_OPS, opsTimer); + return result; } + private ImportReport buildReportAndNotify( + TrackerImportParams params, + ValidationReport validationReport, + TimingsStats opsTimer, + Map bundleSize) { + ImportReport importReport = + ImportReport.withValidationErrors( + validationReport, + opsTimer.stopTimer(), + bundleSize.values().stream().mapToInt(Integer::intValue).sum()); + + endImport(params, importReport); + + return importReport; + } + private boolean exitOnError(ValidationReport validationReport, TrackerImportParams params) { return validationReport.hasErrors() && params.getAtomicMode() == AtomicMode.ALL; } @@ -152,6 +228,14 @@ private Map calculatePayloadSize(TrackerBundle bundle) { TrackerType.RELATIONSHIP, bundle.getRelationships().size()); } + protected TrackerBundle preheatBundle(TrackerImportParams params) { + return trackerBundleService.create(params); + } + + protected void preProcessBundle(TrackerBundle bundle) { + trackerPreprocessService.preprocess(bundle); + } + protected PersistenceReport commitBundle(TrackerBundle trackerBundle) { PersistenceReport persistenceReport = trackerBundleService.commit(trackerBundle); @@ -160,7 +244,7 @@ protected PersistenceReport commitBundle(TrackerBundle trackerBundle) { Stream.of(TrackerType.ENROLLMENT, TrackerType.EVENT) .map(trackerType -> safelyGetSideEffectsDataBundles(persistenceReport, trackerType)) .flatMap(Collection::stream) - .toList(); + .collect(Collectors.toList()); trackerBundleService.handleTrackerSideEffects(sideEffectDataBundles); } @@ -181,6 +265,48 @@ protected PersistenceReport deleteBundle(TrackerBundle trackerBundle) { return trackerBundleService.delete(trackerBundle); } + private void startImport(TrackerImportParams params) { + if (null != params.getJobConfiguration()) { + notifier.notify(params.getJobConfiguration(), params.userStartInfo() + " Import:Start"); + } + } + + private void notifyOps(TrackerImportParams params, String validationOps, TimingsStats opsTimer) { + if (null != params.getJobConfiguration()) { + notifier.update( + params.getJobConfiguration(), + NotificationLevel.DEBUG, + params + + validationOps + + " completed in " + + opsTimer.get(validationOps) + + " Import:" + + validationOps); + } + } + + private void endImport(TrackerImportParams params, ImportReport importReport) { + if (null != params.getJobConfiguration()) { + notifier.update( + params.getJobConfiguration(), + params + " finished in " + importReport.getTimingsStats().get(TOTAL_OPS) + " Import:Done", + true); + + notifier.addJobSummary(params.getJobConfiguration(), importReport, ImportReport.class); + } + } + + private void endImportWithError( + TrackerImportParams params, ImportReport importReport, Exception e) { + notifier.update( + params.getJobConfiguration(), + NotificationLevel.ERROR, + params + " failed with exception: " + e.getMessage() + " Import:Error", + true); + + notifier.addJobSummary(params.getJobConfiguration(), importReport, ImportReport.class); + } + /** * Clone the TrackerImportReport and filters out validation data based on the provided {@link * PersistenceReport}. @@ -202,10 +328,11 @@ public ImportReport buildImportReport( if (originalValidationReport != null) { validationReport.addErrors(originalValidationReport.getErrors()); } - if (originalValidationReport != null - && (TrackerBundleReportMode.WARNINGS == reportMode - || TrackerBundleReportMode.FULL == reportMode)) { + if (originalValidationReport != null && TrackerBundleReportMode.WARNINGS == reportMode) { + validationReport.addWarnings(originalValidationReport.getWarnings()); + } else if (originalValidationReport != null && TrackerBundleReportMode.FULL == reportMode) { validationReport.addWarnings(originalValidationReport.getWarnings()); + importReportBuilder.timingsStats(originalImportReport.getTimingsStats()); } importReportBuilder.validationReport(validationReport); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java index 3aaafa746dd5..927c04736253 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java @@ -28,15 +28,12 @@ package org.hisp.dhis.tracker.imports; import org.hisp.dhis.tracker.imports.bundle.TrackerBundle; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; -import org.hisp.dhis.user.User; /** * @author Luciano Fiandesio */ public class ParamsConverter { - public static TrackerBundle convert( - TrackerImportParams params, TrackerObjects trackerObjects, User user) { + public static TrackerBundle convert(TrackerImportParams params) { return TrackerBundle.builder() .importMode(params.getImportMode()) .importStrategy(params.getImportStrategy()) @@ -45,11 +42,11 @@ public static TrackerBundle convert( .skipRuleEngine(params.isSkipRuleEngine()) .flushMode(params.getFlushMode()) .validationMode(params.getValidationMode()) - .trackedEntities(trackerObjects.getTrackedEntities()) - .enrollments(trackerObjects.getEnrollments()) - .events(trackerObjects.getEvents()) - .relationships(trackerObjects.getRelationships()) - .user(user) + .trackedEntities(params.getTrackedEntities()) + .enrollments(params.getEnrollments()) + .events(params.getEvents()) + .relationships(params.getRelationships()) + .user(params.getUser()) .build(); } } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java index 161bc0bc8905..cde712ce7863 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java @@ -29,7 +29,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import java.io.Serializable; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -51,7 +50,7 @@ // which is invalid. Drop @OpenApi.Property annotation after implementing support for the unpacking // of query param classes in OpenApiGenerator @OpenApi.Property(value = TrackerIdScheme.class) -public class TrackerIdSchemeParam implements Serializable { +public class TrackerIdSchemeParam { public static final TrackerIdSchemeParam UID = TrackerIdSchemeParam.of(TrackerIdScheme.UID, null); public static final TrackerIdSchemeParam CODE = diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java index a2fb0826b1e5..83760db26294 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -51,7 +50,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TrackerIdSchemeParams implements Serializable { +public class TrackerIdSchemeParams { /** Specific identifier to match data elements on. */ @JsonProperty @Builder.Default private TrackerIdSchemeParam dataElementIdScheme = TrackerIdSchemeParam.UID; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java index 7467d89bb261..d64c2653dc04 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java @@ -53,7 +53,6 @@ import org.hisp.dhis.tracker.imports.domain.Note; import org.hisp.dhis.tracker.imports.domain.Relationship; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.springframework.stereotype.Component; /** @@ -71,12 +70,12 @@ public class TrackerIdentifierCollector { private final ProgramRuleService programRuleService; - public Map, Set> collect(TrackerObjects trackerObjects) { + public Map, Set> collect(TrackerImportParams params) { final Map, Set> identifiers = new HashMap<>(); - collectTrackedEntities(identifiers, trackerObjects.getTrackedEntities()); - collectEnrollments(identifiers, trackerObjects.getEnrollments()); - collectEvents(identifiers, trackerObjects.getEvents()); - collectRelationships(identifiers, trackerObjects.getRelationships()); + collectTrackedEntities(identifiers, params.getTrackedEntities()); + collectEnrollments(identifiers, params.getEnrollments()); + collectEvents(identifiers, params.getEvents()); + collectRelationships(identifiers, params.getRelationships()); collectProgramRulesFields(identifiers); return identifiers; } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java index 6b5fc80f54fe..df96cda1f128 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java @@ -28,12 +28,21 @@ package org.hisp.dhis.tracker.imports; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.hisp.dhis.scheduling.JobParameters; +import org.hisp.dhis.scheduling.JobConfiguration; +import org.hisp.dhis.scheduling.JobType; import org.hisp.dhis.tracker.imports.bundle.TrackerBundleMode; +import org.hisp.dhis.tracker.imports.domain.Enrollment; +import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.Relationship; +import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.user.User; /** * @author Morten Olav Hansen @@ -42,10 +51,13 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TrackerImportParams implements JobParameters { +public class TrackerImportParams { /** User uid to use for import job. */ @JsonProperty private String userId; + /** User to use for import job. */ + private User user; + /** Should import be imported or just validated. */ @JsonProperty @Builder.Default private final TrackerBundleMode importMode = TrackerBundleMode.COMMIT; @@ -79,6 +91,50 @@ public class TrackerImportParams implements JobParameters { /** Name of file that was used for import (if available). */ @JsonProperty @Builder.Default private final String filename = null; + /** Job configuration */ + private JobConfiguration jobConfiguration; + @JsonProperty @Builder.Default private TrackerBundleReportMode reportMode = TrackerBundleReportMode.ERRORS; + + /** Tracked entities to import. */ + @JsonProperty @Builder.Default + private final List trackedEntities = new ArrayList<>(); + + /** Enrollments to import. */ + @JsonProperty @Builder.Default private final List enrollments = new ArrayList<>(); + + /** Events to import. */ + @JsonProperty @Builder.Default private final List events = new ArrayList<>(); + + /** Relationships to import. */ + @JsonProperty @Builder.Default private final List relationships = new ArrayList<>(); + + public TrackerImportParams setUser(User user) { + this.user = user; + + if (user != null) { + this.userId = user.getUid(); + } + + return this; + } + + @JsonProperty + public String getUsername() { + return User.username(user); + } + + @Override + public String toString() { + return Optional.ofNullable(this.getJobConfiguration()) + .map( + jobConfiguration -> + JobType.TRACKER_IMPORT_JOB + " ( " + jobConfiguration.getUid() + " )") + .orElse(JobType.TRACKER_IMPORT_JOB.toString()); + } + + public String userStartInfo() { + return this + " started by " + this.getUsername() + " ( " + this.userId + " )"; + } } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java index caa72a9b64f8..23d3222af8cc 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java @@ -27,9 +27,6 @@ */ package org.hisp.dhis.tracker.imports; -import org.hisp.dhis.scheduling.JobProgress; -import org.hisp.dhis.scheduling.NoopJobProgress; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; /** @@ -40,25 +37,10 @@ public interface TrackerImportService { * Import object using provided params. Takes the objects through all phases of the importer from * preheating to validation, and then finished with a commit (unless its validate only) * - * @param params Parameters for import - * @param trackerObjects the objects to import + * @param params Parameters for import, including objects * @return Report giving status of import (and any errors) */ - default ImportReport importTracker(TrackerImportParams params, TrackerObjects trackerObjects) { - return importTracker(params, trackerObjects, NoopJobProgress.INSTANCE); - } - - /** - * Import object using provided params. Takes the objects through all phases of the importer from - * preheating to validation, and then finished with a commit (unless its validate only) - * - * @param params Parameters for import - * @param trackerObjects the objects to import - * @param jobProgress to track import progress - * @return Report giving status of import (and any errors) - */ - ImportReport importTracker( - TrackerImportParams params, TrackerObjects trackerObjects, JobProgress jobProgress); + ImportReport importTracker(TrackerImportParams params); /** * Build the report based on the mode selected by the client. diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java index a8699eadad70..0374ea7aa1b7 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java @@ -41,7 +41,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.bundle.persister.CommitService; import org.hisp.dhis.tracker.imports.bundle.persister.TrackerObjectDeletionService; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.job.TrackerSideEffectDataBundle; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheatService; @@ -49,7 +48,6 @@ import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.report.TrackerTypeReport; import org.hisp.dhis.tracker.imports.sideeffect.SideEffectHandlerService; -import org.hisp.dhis.user.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -80,11 +78,9 @@ public void setSideEffectHandlers(List sideEffectHandl } @Override - public TrackerBundle create( - TrackerImportParams params, TrackerObjects trackerObjects, User user) { - TrackerBundle trackerBundle = ParamsConverter.convert(params, trackerObjects, user); - TrackerPreheat preheat = - trackerPreheatService.preheat(trackerObjects, params.getIdSchemes(), user); + public TrackerBundle create(TrackerImportParams params) { + TrackerBundle trackerBundle = ParamsConverter.convert(params); + TrackerPreheat preheat = trackerPreheatService.preheat(params); trackerBundle.setPreheat(preheat); return trackerBundle; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java index cdb50aee5cda..af8e46e72472 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java @@ -29,10 +29,8 @@ import java.util.List; import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.job.TrackerSideEffectDataBundle; import org.hisp.dhis.tracker.imports.report.PersistenceReport; -import org.hisp.dhis.user.User; /** * @author Morten Olav Hansen @@ -44,7 +42,7 @@ public interface TrackerBundleService { * @param params Params object for this bundle. * @return Configured TrackerBundle instance(s) (if bundle splitting is enabled) */ - TrackerBundle create(TrackerImportParams params, TrackerObjects trackerObjects, User user); + TrackerBundle create(TrackerImportParams params); /** * Call rule engine for tracker bundle. diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java index 37134c2f6bff..be0ccf18d421 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -43,7 +42,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Attribute implements Serializable { +public class Attribute { @JsonProperty private MetadataIdentifier attribute; @JsonProperty private String code; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java index b00612269568..567290315e17 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -42,7 +41,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Coordinate implements Serializable { +public class Coordinate { @JsonProperty private Double latitude; @JsonProperty private Double longitude; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java index d0b0a7de9f93..fd1e6689c491 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -42,7 +41,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class DataValue implements Serializable { +public class DataValue { @JsonProperty private Instant createdAt; @JsonProperty private Instant updatedAt; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java index 0e702d9bbf81..d5ec22ed7d47 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -46,7 +45,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Enrollment implements TrackerDto, Serializable { +public class Enrollment implements TrackerDto { @JsonProperty private String enrollment; @JsonProperty private Instant createdAt; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java index 5298abab4e03..4b30f68fb4c1 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java @@ -29,7 +29,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.HashSet; @@ -50,7 +49,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Event implements TrackerDto, Serializable { +public class Event implements TrackerDto { @JsonProperty private String event; @JsonProperty @Builder.Default private EventStatus status = EventStatus.ACTIVE; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java index 3ad1b265787b..3b28029e61b4 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java @@ -29,7 +29,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import java.util.Objects; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -58,7 +57,7 @@ */ @Value @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class MetadataIdentifier implements Serializable { +public class MetadataIdentifier { public static final MetadataIdentifier EMPTY_UID = MetadataIdentifier.ofUid((String) null); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java index 5401ed822ccc..cec45da897d7 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -45,7 +44,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Note implements Serializable { +public class Note { @JsonProperty private String note; @JsonProperty private Instant storedAt; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java index 83beb87b27a5..5219571ab623 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -43,7 +42,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Relationship implements TrackerDto, Serializable { +public class Relationship implements TrackerDto { @JsonProperty private String relationship; @JsonProperty private String relationshipName; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java index cc80e0be0337..12e022a460ae 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -41,7 +40,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class RelationshipItem implements Serializable { +public class RelationshipItem { @JsonProperty private String trackedEntity; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java index 29eaf07e3f9d..7aee6fba58e9 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -46,7 +45,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TrackedEntity implements TrackerDto, Serializable { +public class TrackedEntity implements TrackerDto { @JsonProperty private String trackedEntity; @JsonProperty private MetadataIdentifier trackedEntityType; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java index 0509c17bad16..d30e8891540e 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java @@ -30,7 +30,6 @@ import static org.apache.commons.lang3.StringUtils.isBlank; import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -43,7 +42,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class User implements Serializable { +public class User { @JsonProperty private String uid; @JsonProperty private String username; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java new file mode 100644 index 000000000000..cb2796a2cb23 --- /dev/null +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.tracker.imports.job; + +import org.hisp.dhis.security.SecurityContextRunnable; +import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +/** + * @author Morten Olav Hansen + */ +@Component +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class TrackerImportThread extends SecurityContextRunnable { + private final TrackerImportService trackerImportService; + + private TrackerImportParams trackerImportParams; + + public TrackerImportThread(TrackerImportService trackerImportService) { + this.trackerImportService = trackerImportService; + } + + @Override + public void call() { + Assert.notNull(trackerImportParams, "Field trackerImportParams can not be null. "); + + trackerImportService.importTracker(trackerImportParams); // discard returned report + } + + public void setTrackerImportParams(TrackerImportParams trackerImportParams) { + this.trackerImportParams = trackerImportParams; + } +} diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerJobWebMessageResponse.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerJobWebMessageResponse.java similarity index 92% rename from dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerJobWebMessageResponse.java rename to dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerJobWebMessageResponse.java index 3251757dc7ba..630f30f46e4a 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerJobWebMessageResponse.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerJobWebMessageResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2023, University of Oslo + * Copyright (c) 2004-2022, University of Oslo * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,13 +25,16 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.hisp.dhis.webapi.controller.tracker.imports; +package org.hisp.dhis.tracker.imports.job; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Data; import org.hisp.dhis.webmessage.WebMessageResponse; +/** + * @author Morten Olav Hansen + */ @Data @Builder public class TrackerJobWebMessageResponse implements WebMessageResponse { diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java new file mode 100644 index 000000000000..ab8bcb5ceaab --- /dev/null +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.tracker.imports.job; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import lombok.Builder; +import lombok.Value; +import org.hisp.dhis.artemis.MessageType; +import org.hisp.dhis.artemis.SerializableMessage; +import org.hisp.dhis.tracker.imports.TrackerImportParams; + +/** + * Used by Apache Artemis to pass tracker import jobs from the /api/tracker endpoint to the tracker + * import services. + * + * @author Morten Olav Hansen + */ +@Value +@Builder(builderClassName = "TrackerMessageBuilder") +@JsonDeserialize(builder = TrackerMessage.TrackerMessageBuilder.class) +public class TrackerMessage implements SerializableMessage { + @JsonProperty private final String uid; + + @JsonProperty private final String authentication; + + @JsonProperty private final TrackerImportParams trackerImportParams; + + @Override + public MessageType getMessageType() { + return MessageType.TRACKER_JOB; + } + + @JsonPOJOBuilder(withPrefix = "") + public static final class TrackerMessageBuilder {} +} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java new file mode 100644 index 000000000000..ef8d8abfbef7 --- /dev/null +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.tracker.imports.job; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import javax.jms.JMSException; +import javax.jms.TextMessage; +import org.hisp.dhis.artemis.Topics; +import org.hisp.dhis.common.AsyncTaskExecutor; +import org.hisp.dhis.scheduling.JobConfiguration; +import org.hisp.dhis.scheduling.JobType; +import org.hisp.dhis.security.AuthenticationSerializer; +import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.springframework.beans.factory.ObjectFactory; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +/** + * @author Morten Olav Hansen + */ +@Component +public class TrackerMessageManager { + private final ObjectMapper objectMapper; + + private final AsyncTaskExecutor taskExecutor; + + private final ObjectFactory trackerImportThreadFactory; + + public TrackerMessageManager( + ObjectMapper objectMapper, + AsyncTaskExecutor taskExecutor, + ObjectFactory trackerImportThreadFactory) { + this.objectMapper = objectMapper; + this.taskExecutor = taskExecutor; + this.trackerImportThreadFactory = trackerImportThreadFactory; + } + + @JmsListener( + destination = Topics.TRACKER_IMPORT_JOB_TOPIC_NAME, + containerFactory = "jmsQueueListenerContainerFactory") + public void consume(TextMessage message) throws JMSException, JsonProcessingException { + String payload = message.getText(); + + TrackerMessage trackerMessage = objectMapper.readValue(payload, TrackerMessage.class); + TrackerImportParams trackerImportParams = trackerMessage.getTrackerImportParams(); + + JobConfiguration jobConfiguration = + new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, trackerImportParams.getUserId()); + + jobConfiguration.setUid(trackerMessage.getUid()); + trackerImportParams.setJobConfiguration(jobConfiguration); + + TrackerImportThread trackerImportThread = trackerImportThreadFactory.getObject(); + trackerImportThread.setTrackerImportParams(trackerImportParams); + + SecurityContextHolder.getContext() + .setAuthentication( + AuthenticationSerializer.deserialize(trackerMessage.getAuthentication())); + + taskExecutor.executeTask(trackerImportThread); + } +} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java index c2de4078f69d..3051680314c2 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java @@ -36,10 +36,8 @@ import lombok.extern.slf4j.Slf4j; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.preheat.PreheatException; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.supplier.PreheatSupplier; -import org.hisp.dhis.user.User; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; @@ -72,18 +70,17 @@ public void setApplicationContext(ApplicationContext applicationContext) throws @Override @Transactional(readOnly = true) - public TrackerPreheat preheat( - TrackerObjects trackerObjects, TrackerIdSchemeParams idSchemeParams, User user) { + public TrackerPreheat preheat(TrackerImportParams params) { TrackerPreheat preheat = new TrackerPreheat(); - preheat.setIdSchemes(idSchemeParams); - preheat.setUser(user); + preheat.setIdSchemes(params.getIdSchemes()); + preheat.setUser(params.getUser()); checkNotNull(preheat.getUser(), "TrackerPreheat is missing the user object."); for (String supplier : preheatSuppliers) { final String beanName = Introspector.decapitalize(supplier); try { - ctx.getBean(beanName, PreheatSupplier.class).add(trackerObjects, preheat); + ctx.getBean(beanName, PreheatSupplier.class).add(params, preheat); } catch (BeansException beanException) { processException( "Unable to find a preheat supplier with name " diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java index 05b97823a1ca..83425bab3a07 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java @@ -27,9 +27,7 @@ */ package org.hisp.dhis.tracker.imports.preheat; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; -import org.hisp.dhis.user.User; +import org.hisp.dhis.tracker.imports.TrackerImportParams; /** * @author Morten Olav Hansen @@ -41,6 +39,5 @@ public interface TrackerPreheatService { * * @param params Params for preheating */ - TrackerPreheat preheat( - TrackerObjects trackerObjects, TrackerIdSchemeParams idSchemeParams, User user); + TrackerPreheat preheat(TrackerImportParams params); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java index 8a7d1958a208..0b344e8e4d82 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java @@ -33,7 +33,7 @@ import org.apache.commons.lang3.time.StopWatch; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.hibernate.HibernateProxyUtils; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; @@ -50,7 +50,7 @@ public abstract class AbstractPreheatSupplier implements PreheatSupplier { private final long CACHE_CAPACITY = 1000; @Override - public void add(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void add(TrackerImportParams params, TrackerPreheat preheat) { StopWatch watch = null; if (log.isDebugEnabled()) { log.debug("Executing preheat supplier: {}", this.getClass().getName()); @@ -58,7 +58,7 @@ public void add(TrackerObjects trackerObjects, TrackerPreheat preheat) { watch.start(); } - preheatAdd(trackerObjects, preheat); + preheatAdd(params, preheat); if (log.isDebugEnabled()) { if (watch != null && watch.isStarted()) { @@ -72,7 +72,7 @@ public void add(TrackerObjects trackerObjects, TrackerPreheat preheat) { } /** Template method: executes preheat logic from the subclass */ - public abstract void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat); + public abstract void preheatAdd(TrackerImportParams params, TrackerPreheat preheat); protected void addToCache(PreheatCacheService cache, List objects) { objects.forEach( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java index 93c256b92412..831441c6dc90 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java @@ -35,7 +35,7 @@ import java.util.Set; import lombok.RequiredArgsConstructor; import org.hisp.dhis.tracker.imports.TrackerIdentifierCollector; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.ClassBasedSupplierStrategy; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.GenericStrategy; @@ -67,13 +67,13 @@ public class ClassBasedSupplier extends AbstractPreheatSupplier implements Appli private final Map classStrategies; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { /* * Collects all references from the payload and create a Map where key * is the reference type (e.g. Enrollment) and the value is a Set of * identifiers (e.g. a list of all Enrollment UIDs found in the payload) */ - Map, Set> identifierMap = identifierCollector.collect(trackerObjects); + Map, Set> identifierMap = identifierCollector.collect(params); identifierMap.forEach( (key, identifiers) -> { @@ -90,7 +90,7 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { } else { context .getBean(Introspector.decapitalize(bean), ClassBasedSupplierStrategy.class) - .add(splitList, preheat); + .add(params, splitList, preheat); } }); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java index 7db809ab2c3c..bf12d2c46db3 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java @@ -36,7 +36,7 @@ import org.hisp.dhis.category.CategoryOptionCombo; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; import org.hisp.dhis.tracker.imports.preheat.mappers.CategoryComboMapper; @@ -59,7 +59,7 @@ public class DefaultsSupplier extends AbstractPreheatSupplier { @Nonnull private final PreheatCacheService cache; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { // not using manager.getDefaults() as the collections of the entities // are still hibernate proxies // this leads to lazy init exceptions with - no session. reason is the diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java index 89ec6171e11c..a91c405021ba 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java @@ -34,8 +34,8 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.relationship.RelationshipStore; import org.hisp.dhis.relationship.RelationshipType; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Relationship; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.RelationshipMapper; import org.hisp.dhis.tracker.imports.util.RelationshipKeySupport; @@ -47,9 +47,9 @@ public class DuplicateRelationshipSupplier extends AbstractPreheatSupplier { @Nonnull private final RelationshipStore relationshipStore; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { List relationships = - retrieveRelationshipKeys(trackerObjects.getRelationships(), preheat); + retrieveRelationshipKeys(params.getRelationships(), preheat); relationships.stream() .map(RelationshipMapper.INSTANCE::map) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java index e26b40d99e51..f8c9338257d0 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java @@ -36,7 +36,7 @@ import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStore; import org.hisp.dhis.program.ProgramType; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.EnrollmentMapper; import org.springframework.stereotype.Component; @@ -52,7 +52,7 @@ public class EnrollmentSupplier extends AbstractPreheatSupplier { @Nonnull private final ProgramStore programStore; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { List programsWithoutRegistration = preheat.getAll(Program.class).stream() .filter(program -> program.getProgramType().equals(ProgramType.WITHOUT_REGISTRATION)) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java index f3981a09d4d5..4a0190c49171 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java @@ -33,7 +33,7 @@ import java.util.stream.Collectors; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.program.Enrollment; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -64,7 +64,7 @@ protected EnrollmentsWithAtLeastOneEventSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { final Map enrollments = preheat.getEnrollments(); List programStageIds = enrollments.values().stream().map(IdentifiableObject::getId).collect(Collectors.toList()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java index 8d3ce4dd9221..2409d9c2a61d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java @@ -40,9 +40,9 @@ import org.hisp.dhis.category.CategoryService; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.CategoryOptionComboMapper; import org.springframework.stereotype.Component; @@ -63,10 +63,10 @@ public class EventCategoryOptionComboSupplier extends AbstractPreheatSupplier { @Nonnull private final CategoryService categoryService; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { List>> events = - trackerObjects.getEvents().stream() + params.getEvents().stream() .filter( e -> e.getAttributeOptionCombo().isBlank() diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java index fa1a2128754d..bdf845453377 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java @@ -31,8 +31,8 @@ import java.util.Objects; import java.util.stream.Collectors; import org.hisp.dhis.program.ProgramStage; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; @@ -72,13 +72,13 @@ protected EventProgramStageMapSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { - if (trackerObjects.getEvents().isEmpty()) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + if (params.getEvents().isEmpty()) { return; } List notRepeatableProgramStageUids = - trackerObjects.getEvents().stream() + params.getEvents().stream() .map(Event::getProgramStage) .filter(Objects::nonNull) .map(preheat::getProgramStage) @@ -90,7 +90,7 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { .collect(Collectors.toList()); List enrollmentUids = - trackerObjects.getEvents().stream() + params.getEvents().stream() .map(Event::getEnrollment) .filter(Objects::nonNull) .distinct() diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java index 186716c87d47..6a0cc39b88cd 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java @@ -39,10 +39,10 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.stereotype.Component; @@ -55,8 +55,9 @@ public class FileResourceSupplier extends AbstractPreheatSupplier { @Nonnull private final FileResourceService fileResourceService; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { - TrackerIdSchemeParams idSchemes = preheat.getIdSchemes(); + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + TrackerIdSchemeParams idSchemes = params.getIdSchemes(); + List fileResourceAttributes = preheat.getAll(TrackedEntityAttribute.class).stream() .filter(at -> at.getValueType().isFile()) @@ -70,15 +71,15 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { .collect(Collectors.toList()); List fileResourceIds = new ArrayList<>(); - trackerObjects + params .getTrackedEntities() .forEach( te -> collectResourceIds(fileResourceAttributes, fileResourceIds, te.getAttributes())); - trackerObjects + params .getEnrollments() .forEach( en -> collectResourceIds(fileResourceAttributes, fileResourceIds, en.getAttributes())); - trackerObjects + params .getEvents() .forEach( en -> diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java index 9918e4f6bdf6..ef817a04a2da 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java @@ -41,10 +41,10 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.stereotype.Component; @@ -57,7 +57,7 @@ public class OrgUnitValueTypeSupplier extends AbstractPreheatSupplier { @Nonnull private final IdentifiableObjectManager manager; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { TrackerIdSchemeParams idSchemes = preheat.getIdSchemes(); List orgUnitAttributes = @@ -73,13 +73,13 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { .collect(Collectors.toList()); List orgUnitIds = new ArrayList<>(); - trackerObjects + params .getTrackedEntities() .forEach(te -> collectResourceIds(orgUnitAttributes, orgUnitIds, te.getAttributes())); - trackerObjects + params .getEnrollments() .forEach(en -> collectResourceIds(orgUnitAttributes, orgUnitIds, en.getAttributes())); - trackerObjects + params .getEvents() .forEach(ev -> collectResourceIds(orgUnitDataElements, orgUnitIds, ev.getDataValues())); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java index 94ae63808d93..a9d832164f76 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java @@ -35,7 +35,7 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodStore; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; import org.springframework.stereotype.Component; @@ -51,7 +51,7 @@ public class PeriodTypeSupplier extends AbstractPreheatSupplier { @Nonnull private final PreheatCacheService cache; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { if (cache.hasKey(Period.class.getName())) { preheat.put(TrackerIdSchemeParam.UID, cache.getAll(Period.class.getName())); } else { diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java index 231addb5deb3..f57986b87bad 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports.preheat.supplier; import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; /** @@ -40,8 +39,8 @@ public interface PreheatSupplier { /** * Adds data to the {@link TrackerPreheat} using the supplied {@link TrackerImportParams} * - * @param trackerObjects {@link TrackerObjects} + * @param params {@link TrackerImportParams} * @param preheat {@link TrackerPreheat} */ - void add(TrackerObjects trackerObjects, TrackerPreheat preheat); + void add(TrackerImportParams params, TrackerPreheat preheat); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java index ee4b26b85a5b..e44c6459bf5b 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java @@ -31,7 +31,7 @@ import java.util.stream.Collectors; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -55,7 +55,7 @@ protected ProgramOrgUnitsSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { // fetch all existing Org Units from payload final List orgUnitIds = preheat.getAll(OrganisationUnit.class).stream() diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java index 87c909951e01..7dcd04847c3f 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java @@ -38,8 +38,8 @@ import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityProgramOwnerOrgUnit; import org.hisp.dhis.trackedentity.TrackedEntityProgramOwnerStore; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.OrganisationUnitMapper; import org.springframework.stereotype.Component; @@ -53,18 +53,18 @@ public class ProgramOwnerSupplier extends AbstractPreheatSupplier { @Nonnull private final TrackedEntityProgramOwnerStore trackedEntityProgramOwnerStore; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { final Map preheatedTrackedEntities = preheat.getTrackedEntities(); final Map preheatedEnrollments = preheat.getEnrollments(); Set teIds = new HashSet<>(); - for (org.hisp.dhis.tracker.imports.domain.Enrollment en : trackerObjects.getEnrollments()) { + for (org.hisp.dhis.tracker.imports.domain.Enrollment en : params.getEnrollments()) { TrackedEntity te = preheatedTrackedEntities.get(en.getTrackedEntity()); if (te != null) { teIds.add(te.getId()); } } - for (Event ev : trackerObjects.getEvents()) { + for (Event ev : params.getEvents()) { Enrollment enrollment = preheatedEnrollments.get(ev.getEnrollment()); if (enrollment != null && enrollment.getTrackedEntity() != null) { teIds.add(enrollment.getTrackedEntity().getId()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java index 9072523a59e1..3b075fed7f1e 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java @@ -37,7 +37,7 @@ import org.hisp.dhis.program.Enrollment; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStatus; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.util.Constant; import org.springframework.jdbc.core.JdbcTemplate; @@ -97,9 +97,9 @@ protected TrackedEntityEnrollmentSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { List trackedEntityList = - trackerObjects.getEnrollments().stream() + params.getEnrollments().stream() .map(org.hisp.dhis.tracker.imports.domain.Enrollment::getTrackedEntity) .collect(Collectors.toList()); @@ -115,7 +115,7 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { Map> trackedEntityToEnrollmentMap = new HashMap<>(); - if (trackerObjects.getEnrollments().isEmpty()) return; + if (params.getEnrollments().isEmpty()) return; for (List trackedEntityListSubList : trackedEntities) { queryTeiAndAddToMap(trackedEntityToEnrollmentMap, trackedEntityListSubList, programList); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java index 353bb1888b91..598a38bc0d74 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java @@ -52,9 +52,9 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.UniqueAttributeValue; import org.springframework.stereotype.Component; @@ -74,20 +74,20 @@ public class UniqueAttributesSupplier extends AbstractPreheatSupplier { @Nonnull private final TrackedEntityAttributeValueService trackedEntityAttributeValueService; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { List uniqueTrackedEntityAttributes = trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes(); Map> allUniqueAttributesByTrackedEntity = - getAllAttributesByTrackedEntity(trackerObjects, preheat, uniqueTrackedEntityAttributes); + getAllAttributesByTrackedEntity(params, preheat, uniqueTrackedEntityAttributes); List uniqueAttributeValuesFromPayload = getDuplicatedUniqueValuesInPayload(allUniqueAttributesByTrackedEntity); List uniqueAttributeValuesFromDB = getAlreadyPresentInDbUniqueValues( - preheat.getIdSchemes(), + params.getIdSchemes(), allUniqueAttributesByTrackedEntity, uniqueTrackedEntityAttributes); @@ -102,11 +102,11 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { private Map> getAllAttributesByTrackedEntity( - TrackerObjects trackerObjects, + TrackerImportParams params, TrackerPreheat preheat, List uniqueTrackedEntityAttributes) { Map> teUniqueAttributes = - trackerObjects.getTrackedEntities().stream() + params.getTrackedEntities().stream() .collect( toMap( Function.identity(), @@ -115,10 +115,9 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { Map> enrollmentUniqueAttributes = - trackerObjects.getEnrollments().stream() + params.getEnrollments().stream() .collect( - groupingBy( - e -> getEntityForEnrollment(trackerObjects, preheat, e.getTrackedEntity()))) + groupingBy(e -> getEntityForEnrollment(params, preheat, e.getTrackedEntity()))) .entrySet() .stream() .collect( @@ -137,12 +136,12 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { } private org.hisp.dhis.tracker.imports.domain.TrackedEntity getEntityForEnrollment( - TrackerObjects trackerObjects, TrackerPreheat preheat, String teUid) { + TrackerImportParams params, TrackerPreheat preheat, String teUid) { TrackedEntity trackedEntity = preheat.getTrackedEntity(teUid); // Get te from Preheat Optional optionalTe = - trackerObjects.getTrackedEntities().stream() + params.getTrackedEntities().stream() .filter(te -> Objects.equals(te.getTrackedEntity(), teUid)) .findAny(); if (optionalTe.isPresent()) { @@ -153,7 +152,7 @@ private org.hisp.dhis.tracker.imports.domain.TrackedEntity getEntityForEnrollmen new org.hisp.dhis.tracker.imports.domain.TrackedEntity(); te.setTrackedEntity(teUid); te.setOrgUnit( - preheat.getIdSchemes().toMetadataIdentifier(trackedEntity.getOrganisationUnit())); + params.getIdSchemes().toMetadataIdentifier(trackedEntity.getOrganisationUnit())); return te; } else // TE is not present. but we do not fail here. // A validation error will be thrown in validation phase diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java index ff98ac18a259..0f119ea5a100 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java @@ -37,8 +37,8 @@ import org.apache.commons.lang3.StringUtils; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.IdentifiableObjectManager; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.domain.User; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.UserMapper; @@ -56,9 +56,9 @@ public class UserSupplier extends AbstractPreheatSupplier { @Nonnull private final UserService userService; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { Set userUids = - trackerObjects.getEvents().stream() + params.getEvents().stream() .filter(Objects::nonNull) .map(Event::getAssignedUser) .filter(Objects::nonNull) @@ -67,7 +67,7 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { .collect(Collectors.toSet()); Set usernames = - trackerObjects.getEvents().stream() + params.getEvents().stream() .filter(Objects::nonNull) .map(Event::getAssignedUser) .filter(Objects::nonNull) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java index a2523c34631c..0702e56f7c44 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java @@ -37,9 +37,9 @@ import org.hisp.dhis.common.ValueType; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.UserMapper; import org.hisp.dhis.user.User; @@ -56,7 +56,7 @@ public class UsernameValueTypeSupplier extends AbstractPreheatSupplier { @Nonnull private final UserService userService; @Override - public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { List attributes = preheat.getAll(TrackedEntityAttribute.class); TrackerIdSchemeParams idSchemes = preheat.getIdSchemes(); @@ -68,10 +68,10 @@ public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List usernames = new ArrayList<>(); - trackerObjects + params .getTrackedEntities() .forEach(te -> collectResourceIds(usernameAttributes, usernames, te.getAttributes())); - trackerObjects + params .getEnrollments() .forEach(en -> collectResourceIds(usernameAttributes, usernames, en.getAttributes())); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java index b33812b83b40..da4e957a096e 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java @@ -44,6 +44,7 @@ import org.hisp.dhis.schema.SchemaService; import org.hisp.dhis.tracker.imports.TrackerIdScheme; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; import org.hisp.dhis.tracker.imports.preheat.mappers.CopyMapper; @@ -78,8 +79,9 @@ protected AbstractSchemaStrategy( } @Override - public void add(List> splitList, TrackerPreheat preheat) { - TrackerIdSchemeParam idSchemeParam = preheat.getIdSchemes().getByClass(getSchemaClass()); + public void add( + TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + TrackerIdSchemeParam idSchemeParam = params.getIdSchemes().getByClass(getSchemaClass()); Schema schema = schemaService.getDynamicSchema(getSchemaClass()); queryForIdentifiableObjects(preheat, schema, idSchemeParam, splitList, mapper()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java index 9b6811151a03..3bdff20cc475 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java @@ -28,11 +28,12 @@ package org.hisp.dhis.tracker.imports.preheat.supplier.strategy; import java.util.List; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; /** * @author Luciano Fiandesio */ public interface ClassBasedSupplierStrategy { - void add(List> splitList, TrackerPreheat preheat); + void add(TrackerImportParams params, List> splitList, TrackerPreheat preheat); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java index 03e8ea052440..2875cba5ee7d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java @@ -32,6 +32,7 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.program.Enrollment; import org.hisp.dhis.program.EnrollmentStore; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.EnrollmentMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -49,7 +50,8 @@ public class EnrollmentStrategy implements ClassBasedSupplierStrategy { @Nonnull private final EnrollmentStore enrollmentStore; @Override - public void add(List> splitList, TrackerPreheat preheat) { + public void add( + TrackerImportParams params, List> splitList, TrackerPreheat preheat) { for (List ids : splitList) { List enrollments = enrollmentStore.getIncludingDeleted(ids); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java index aceb75b5833d..5148447256d4 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java @@ -32,6 +32,7 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.program.Event; import org.hisp.dhis.program.EventStore; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.EventMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -47,7 +48,8 @@ public class EventStrategy implements ClassBasedSupplierStrategy { @Nonnull private final EventStore eventStore; @Override - public void add(List> splitList, TrackerPreheat preheat) { + public void add( + TrackerImportParams params, List> splitList, TrackerPreheat preheat) { for (List ids : splitList) { List events = eventStore.getIncludingDeleted(ids); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java index 0b6fdcd25595..f0d7f3d971db 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java @@ -32,6 +32,7 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.note.Note; import org.hisp.dhis.note.NoteStore; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.NoteMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -47,7 +48,8 @@ public class NoteStrategy implements ClassBasedSupplierStrategy { @Nonnull private final NoteStore noteStore; @Override - public void add(List> splitList, TrackerPreheat preheat) { + public void add( + TrackerImportParams params, List> splitList, TrackerPreheat preheat) { splitList.forEach( ids -> preheat.putNotes( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java index b44a38149515..20902c26b09f 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java @@ -33,6 +33,7 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.relationship.RelationshipStore; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Relationship; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.RelationshipMapper; @@ -49,7 +50,8 @@ public class RelationshipStrategy implements ClassBasedSupplierStrategy { @Nonnull private final RelationshipStore relationshipStore; @Override - public void add(List> splitList, TrackerPreheat preheat) { + public void add( + TrackerImportParams params, List> splitList, TrackerPreheat preheat) { List relationships = retrieveRelationships(splitList); preheat.putRelationships( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java index 182f8645c2cc..27f29f913215 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java @@ -32,6 +32,7 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityStore; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.TrackedEntityMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -49,7 +50,8 @@ public class TrackerEntityStrategy implements ClassBasedSupplierStrategy { @Nonnull private TrackedEntityStore trackedEntityStore; @Override - public void add(List> splitList, TrackerPreheat preheat) { + public void add( + TrackerImportParams params, List> splitList, TrackerPreheat preheat) { for (List ids : splitList) { // Fetch all Tracked Entity present in the payload List trackedEntities = trackedEntityStore.getIncludingDeleted(ids); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java index 15670984a5de..d9545c36e13a 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java @@ -75,6 +75,9 @@ public class ImportReport { */ @JsonProperty Stats stats; + /** A report object containing the elapsed time for each Import stage */ + @JsonProperty TimingsStats timingsStats; + /** A report containing the outcome of the commit stage (e.g. how many entities were persisted) */ @JsonProperty("bundleReport") PersistenceReport persistenceReport; @@ -93,13 +96,15 @@ public class ImportReport { * therefore all bundle objects were ignored. * * @param validationReport The validation report + * @param timingsStats The timing stats * @param bundleSize The sum of all bundle objects */ public static ImportReport withValidationErrors( - ValidationReport validationReport, int bundleSize) { + ValidationReport validationReport, TimingsStats timingsStats, int bundleSize) { return builder() .status(Status.ERROR) .validationReport(validationReport) + .timingsStats(timingsStats) .stats(Stats.builder().ignored(bundleSize).build()) .build(); } @@ -114,12 +119,15 @@ public static ImportReport withValidationErrors( * * @param message The error message * @param validationReport The validation report if available + * @param timingsStats The timing stats if available */ - public static ImportReport withError(String message, ValidationReport validationReport) { + public static ImportReport withError( + String message, ValidationReport validationReport, TimingsStats timingsStats) { // TODO shall we calculate stats in this case? return builder() .status(Status.ERROR) .validationReport(validationReport) + .timingsStats(timingsStats) .message(message) .build(); } @@ -134,6 +142,7 @@ public static ImportReport withError(String message, ValidationReport validation * @param persistenceReport The report containing how many bundle objects were successfully * persisted * @param validationReport The validation report if available + * @param timingsStats The timing stats if available * @param bundleSize a map containing the size of each entity type in the Bundle - before the * validation */ @@ -141,6 +150,7 @@ public static ImportReport withImportCompleted( Status status, PersistenceReport persistenceReport, ValidationReport validationReport, + TimingsStats timingsStats, Map bundleSize) { Stats stats = Stats.builder().build(); Stats brs = persistenceReport.getStats(); @@ -149,6 +159,7 @@ public static ImportReport withImportCompleted( return builder() .status(status) .validationReport(validationReport) + .timingsStats(timingsStats) .persistenceReport(processBundleReport(persistenceReport, bundleSize)) .stats(stats) .build(); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java new file mode 100644 index 000000000000..594ac149f333 --- /dev/null +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.tracker.imports.report; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Supplier; +import lombok.Data; +import org.hisp.dhis.commons.timer.SystemTimer; +import org.hisp.dhis.commons.timer.Timer; + +/** + * This report keeps track of the elapsed time for each stage of the validation process. + * + * @author Luciano Fiandesio + */ +@Data +public class TimingsStats { + public static final String PREHEAT_OPS = "preheat"; + + public static final String PREPROCESS_OPS = "preprocess"; + + public static final String COMMIT_OPS = "commit"; + + public static final String VALIDATION_OPS = "validation"; + + public static final String PROGRAMRULE_OPS = "programrule"; + + public static final String VALIDATE_PROGRAMRULE_OPS = "programruleValidation"; + + public static final String TOTAL_OPS = "totalImport"; + + public static final String PREPARE_REQUEST_OPS = "prepareRequest"; + + public static final String TOTAL_REQUEST_OPS = "totalRequest"; + + @JsonProperty private Map timers = new LinkedHashMap<>(); + + private static final String DEFAULT_VALUE = "0.0 sec."; + + public String getPrepareRequest() { + return timers.getOrDefault(PREPARE_REQUEST_OPS, DEFAULT_VALUE); + } + + public String getValidation() { + return timers.getOrDefault(VALIDATION_OPS, DEFAULT_VALUE); + } + + public String getCommit() { + return timers.getOrDefault(COMMIT_OPS, DEFAULT_VALUE); + } + + public String getPreheat() { + return timers.getOrDefault(PREHEAT_OPS, DEFAULT_VALUE); + } + + public String getProgramRule() { + return timers.getOrDefault(PROGRAMRULE_OPS, DEFAULT_VALUE); + } + + public String getTotalImport() { + return timers.getOrDefault(TOTAL_OPS, DEFAULT_VALUE); + } + + public String getTotalRequest() { + + return timers.getOrDefault(TOTAL_REQUEST_OPS, DEFAULT_VALUE); + } + + @JsonIgnore private Timer totalTimer; + + public TimingsStats() { + totalTimer = new SystemTimer().start(); + } + + public void set(String timedOperation, String elapsed) { + this.timers.put(timedOperation, elapsed); + } + + /** + * Executes the given Supplier and measure the elapsed time. + * + * @param timedOperation the operation name to place in the timers map + * @param supplier ths Supplier to execute + * @return the result of the Supplier invocation + */ + public T exec(String timedOperation, Supplier supplier) { + Timer timer = new SystemTimer().start(); + + T result = supplier.get(); + + timer.stop(); + + this.set(timedOperation, timer.toString()); + + return result; + } + + /** + * Executes the given operation. + * + * @param timedOperation the operation name to place in the timers map + * @param runnable the operation to execute + */ + public void execVoid(String timedOperation, Runnable runnable) { + Timer timer = new SystemTimer().start(); + + runnable.run(); + + timer.stop(); + + this.set(timedOperation, timer.toString()); + } + + public TimingsStats stopTimer() { + if (totalTimer != null) { + totalTimer.stop(); + this.timers.put(TOTAL_OPS, totalTimer.toString()); + } + return this; + } + + public String get(String validationOps) { + return this.timers.getOrDefault(validationOps, DEFAULT_VALUE); + } +} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java index 8fe3e1309cb0..89a605f721e1 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java @@ -65,7 +65,6 @@ import org.hisp.dhis.tracker.imports.domain.Relationship; import org.hisp.dhis.tracker.imports.domain.RelationshipItem; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -82,6 +81,13 @@ void setUp() { @Test void collectTrackedEntities() { + + TrackerIdSchemeParams idSchemes = + TrackerIdSchemeParams.builder() + .idScheme(TrackerIdSchemeParam.ofAttribute("NTVsGflP5Ix")) + .orgUnitIdScheme(TrackerIdSchemeParam.NAME) + .build(); + TrackedEntity trackedEntity = TrackedEntity.builder() .trackedEntity(uid()) @@ -90,10 +96,10 @@ void collectTrackedEntities() { .attributes(teAttributes("VohJnvWfvyo", "qv9xOw8fBzy")) .build(); - TrackerObjects trackerObjects = - TrackerObjects.builder().trackedEntities(singletonList(trackedEntity)).build(); + TrackerImportParams params = + params(idSchemes).trackedEntities(singletonList(trackedEntity)).build(); - Map, Set> ids = collector.collect(trackerObjects); + Map, Set> ids = collector.collect(params); assertNotNull(ids); assertContainsOnly(Set.of(trackedEntity.getTrackedEntity()), ids.get(TrackedEntity.class)); @@ -104,6 +110,13 @@ void collectTrackedEntities() { @Test void collectEnrollments() { + + TrackerIdSchemeParams idSchemes = + TrackerIdSchemeParams.builder() + .orgUnitIdScheme(TrackerIdSchemeParam.NAME) + .programIdScheme(TrackerIdSchemeParam.ofAttribute("NTVsGflP5Ix")) + .build(); + Enrollment enrollment = Enrollment.builder() .enrollment(uid()) @@ -113,10 +126,9 @@ void collectEnrollments() { .attributes(teAttributes("VohJnvWfvyo", "qv9xOw8fBzy")) .build(); - TrackerObjects trackerObjects = - TrackerObjects.builder().enrollments(singletonList(enrollment)).build(); + TrackerImportParams params = params(idSchemes).enrollments(singletonList(enrollment)).build(); - Map, Set> ids = collector.collect(trackerObjects); + Map, Set> ids = collector.collect(params); assertNotNull(ids); assertContainsOnly(Set.of(enrollment.getUid()), ids.get(Enrollment.class)); @@ -150,9 +162,9 @@ void collectEvents() { .notes(List.of(Note.builder().note("i1vviSlidJE").value("nice day!").build())) .build(); - TrackerObjects trackerObjects = TrackerObjects.builder().events(singletonList(event)).build(); + TrackerImportParams params = params(idSchemes).events(singletonList(event)).build(); - Map, Set> ids = collector.collect(trackerObjects); + Map, Set> ids = collector.collect(params); assertNotNull(ids); assertContainsOnly(Set.of(event.getUid()), ids.get(Event.class)); @@ -170,9 +182,10 @@ void collectEvents() { void collectEventsSkipsNotesWithoutAnId() { Event event = Event.builder().notes(List.of(Note.builder().value("nice day!").build())).build(); - TrackerObjects trackerObjects = TrackerObjects.builder().events(singletonList(event)).build(); + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()).events(singletonList(event)).build(); - Map, Set> ids = collector.collect(trackerObjects); + Map, Set> ids = collector.collect(params); assertNotNull(ids); assertNull(ids.get(org.hisp.dhis.note.Note.class)); @@ -183,9 +196,10 @@ void collectEventsSkipsNotesWithoutAValue() { Event event = Event.builder().notes(List.of(Note.builder().note("i1vviSlidJE").build())).build(); - TrackerObjects trackerObjects = TrackerObjects.builder().events(singletonList(event)).build(); + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()).events(singletonList(event)).build(); - Map, Set> ids = collector.collect(trackerObjects); + Map, Set> ids = collector.collect(params); assertNotNull(ids); assertNull(ids.get(org.hisp.dhis.note.Note.class)); @@ -208,10 +222,10 @@ void collectRelationships() { .to(RelationshipItem.builder().event(uid()).build()) .build(); - TrackerObjects trackerObjects = - TrackerObjects.builder().relationships(singletonList(relationship)).build(); + TrackerImportParams params = + params(idSchemes).relationships(singletonList(relationship)).build(); - Map, Set> ids = collector.collect(trackerObjects); + Map, Set> ids = collector.collect(params); assertNotNull(ids); assertContainsOnly(Set.of(relationship.getRelationship()), ids.get(Relationship.class)); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java index dc32d1c6c9f0..d1b6c5948c67 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java @@ -39,14 +39,12 @@ import java.util.List; import java.util.stream.Collectors; import org.hisp.dhis.random.BeanRandomizer; -import org.hisp.dhis.scheduling.NoopJobProgress; import org.hisp.dhis.system.notification.Notifier; import org.hisp.dhis.tracker.imports.DefaultTrackerImportService; import org.hisp.dhis.tracker.imports.ParamsConverter; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerUserService; import org.hisp.dhis.tracker.imports.domain.Event; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preprocess.TrackerPreprocessService; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.validation.ValidationResult; @@ -80,26 +78,27 @@ class TrackerImporterServiceTest { private TrackerImportParams params = null; - private TrackerObjects trackerObjects; - private final BeanRandomizer rnd = BeanRandomizer.create(); @BeforeEach public void setUp() { subject = new DefaultTrackerImportService( - trackerBundleService, validationService, trackerPreprocessService, trackerUserService); + trackerBundleService, + validationService, + trackerPreprocessService, + trackerUserService, + notifier); final List events = rnd.objects(Event.class, 3).collect(Collectors.toList()); - params = TrackerImportParams.builder().userId("123").build(); - - trackerObjects = - TrackerObjects.builder() + params = + TrackerImportParams.builder() .events(events) .enrollments(new ArrayList<>()) .relationships(new ArrayList<>()) .trackedEntities(new ArrayList<>()) + .userId("123") .build(); PersistenceReport persistenceReport = PersistenceReport.emptyReport(); @@ -111,26 +110,25 @@ public void setUp() { when(validationService.validateRuleEngine(any(TrackerBundle.class))) .thenReturn(validationResult); when(trackerPreprocessService.preprocess(any(TrackerBundle.class))) - .thenReturn(ParamsConverter.convert(params, trackerObjects, new User())); + .thenReturn(ParamsConverter.convert(params)); } @Test void testSkipSideEffect() { TrackerImportParams parameters = - TrackerImportParams.builder().skipSideEffects(true).userId("123").build(); - - TrackerObjects objects = - TrackerObjects.builder() - .events(trackerObjects.getEvents()) + TrackerImportParams.builder() + .events(params.getEvents()) .enrollments(new ArrayList<>()) .relationships(new ArrayList<>()) .trackedEntities(new ArrayList<>()) + .skipSideEffects(true) + .userId("123") .build(); - when(trackerBundleService.create(any(TrackerImportParams.class), any(), any())) - .thenReturn(ParamsConverter.convert(parameters, objects, new User())); + when(trackerBundleService.create(any(TrackerImportParams.class))) + .thenReturn(ParamsConverter.convert(parameters)); - subject.importTracker(parameters, trackerObjects, NoopJobProgress.INSTANCE); + subject.importTracker(parameters); verify(trackerBundleService, times(0)).handleTrackerSideEffects(anyList()); } @@ -140,10 +138,10 @@ void testWithSideEffects() { doAnswer(invocationOnMock -> null) .when(trackerBundleService) .handleTrackerSideEffects(anyList()); - when(trackerBundleService.create(any(TrackerImportParams.class), any(), any())) - .thenReturn(ParamsConverter.convert(params, trackerObjects, new User())); + when(trackerBundleService.create(any(TrackerImportParams.class))) + .thenReturn(ParamsConverter.convert(params)); - subject.importTracker(params, trackerObjects, NoopJobProgress.INSTANCE); + subject.importTracker(params); verify(trackerBundleService, times(1)).handleTrackerSideEffects(anyList()); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java index 84455dbeba55..7b317272e009 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java @@ -37,9 +37,8 @@ import java.util.Collections; import java.util.List; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.supplier.ClassBasedSupplier; import org.hisp.dhis.tracker.imports.preheat.supplier.PreheatSupplier; import org.hisp.dhis.user.User; @@ -73,13 +72,12 @@ class DefaultTrackerPreheatServiceTest { private DefaultTrackerPreheatService preheatService; - private final TrackerObjects preheatParams = - TrackerObjects.builder() + private final TrackerImportParams preheatParams = + TrackerImportParams.builder() + .user(getUser()) .trackedEntities(Collections.singletonList(new TrackedEntity())) .build(); - private final TrackerIdSchemeParams idSchemeParams = TrackerIdSchemeParams.builder().build(); - @BeforeEach public void setUp() { preheatService = @@ -97,7 +95,7 @@ void shouldGetFromContextAndAdd() { doCallRealMethod().when(classBasedSupplier).add(any(), any()); - preheatService.preheat(preheatParams, idSchemeParams, getUser()); + preheatService.preheat(preheatParams); verify(applicationContext).getBean(bean.getValue(), preheatSupplierClassCaptor.getValue()); verify(classBasedSupplier).add(any(), any()); @@ -109,7 +107,7 @@ void shouldDoNothingWhenSupplierBeanNotFound() { when(applicationContext.getBean(bean.capture(), preheatSupplierClassCaptor.capture())) .thenThrow(new BeanCreationException("e")); - preheatService.preheat(preheatParams, idSchemeParams, getUser()); + preheatService.preheat(preheatParams); verify(applicationContext).getBean(bean.getValue(), preheatSupplierClassCaptor.getValue()); verify(classBasedSupplier, times(0)).add(any(), any()); @@ -122,7 +120,7 @@ void shouldDoNothingWhenAddException() { .thenReturn(classBasedSupplier); doThrow(new RuntimeException("e")).when(classBasedSupplier).add(any(), any()); - preheatService.preheat(preheatParams, idSchemeParams, getUser()); + preheatService.preheat(preheatParams); verify(applicationContext).getBean(bean.getValue(), preheatSupplierClassCaptor.getValue()); verify(classBasedSupplier).add(any(), any()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java index e1b10b5a4f5f..3f0afe9218d1 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java @@ -36,8 +36,8 @@ import java.util.HashMap; import java.util.HashSet; import org.hisp.dhis.tracker.imports.TrackerIdentifierCollector; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.ClassBasedSupplierStrategy; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.GenericStrategy; @@ -63,7 +63,7 @@ class ClassBasedSupplierTest { @Mock private GenericStrategy genericStrategy; - @Mock private TrackerObjects trackerObjects; + @Mock private TrackerImportParams trackerImportParams; @Mock private TrackerEntityStrategy trackerEntityStrategy; @@ -74,7 +74,7 @@ public void setUp() { classBasedSupplier = new ClassBasedSupplier(identifierCollector, strategiesMap); classBasedSupplier.setApplicationContext(applicationContext); - when(identifierCollector.collect(trackerObjects)) + when(identifierCollector.collect(trackerImportParams)) .thenReturn( new HashMap<>() { { @@ -91,7 +91,7 @@ void verifyGenericStrategy() { when(applicationContext.getBean(Constant.GENERIC_STRATEGY_BEAN, GenericStrategy.class)) .thenReturn(genericStrategy); - classBasedSupplier.preheatAdd(trackerObjects, new TrackerPreheat()); + classBasedSupplier.preheatAdd(trackerImportParams, new TrackerPreheat()); verify(applicationContext).getBean(Constant.GENERIC_STRATEGY_BEAN, GenericStrategy.class); } @@ -102,7 +102,7 @@ void verifyClassBasedSupplierStrategy() { when(applicationContext.getBean(anyString(), eq(ClassBasedSupplierStrategy.class))) .thenReturn(trackerEntityStrategy); - classBasedSupplier.preheatAdd(trackerObjects, new TrackerPreheat()); + classBasedSupplier.preheatAdd(trackerImportParams, new TrackerPreheat()); verify(applicationContext).getBean("classbasedstrategy", ClassBasedSupplierStrategy.class); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java index 6f2e07b02199..f9fada079f06 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java @@ -39,9 +39,9 @@ import org.hisp.dhis.relationship.RelationshipType; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.RelationshipItem; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -148,12 +148,12 @@ void verifySupplier() { when(relationshipStore.getByUid(List.of(REL_A_UID, REL_B_UID))) .thenReturn(List.of(relationshipA(), relationshipB())); - TrackerObjects trackerObjects = - TrackerObjects.builder() + TrackerImportParams trackerImportParams = + TrackerImportParams.builder() .relationships(List.of(relationshipA, relationshipB, relationshipC)) .build(); - supplier.preheatAdd(trackerObjects, preheat); + supplier.preheatAdd(trackerImportParams, preheat); assertTrue(preheat.isDuplicate(relationshipA)); assertFalse(preheat.isDuplicate(invertTeToTeRelationship(relationshipA))); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java index e10fbf54cbd2..b04efa42457a 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java @@ -43,7 +43,7 @@ import org.hisp.dhis.program.ProgramStore; import org.hisp.dhis.random.BeanRandomizer; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -73,7 +73,7 @@ class EnrollmentSupplierTest extends DhisConvenienceTest { private Program programWithoutRegistration; - private TrackerObjects params; + private TrackerImportParams params; private final BeanRandomizer rnd = BeanRandomizer.create(); @@ -100,7 +100,7 @@ public void setUp() { when(enrollmentStore.getByPrograms(Lists.newArrayList(programWithoutRegistration))) .thenReturn(enrollments); - params = TrackerObjects.builder().build(); + params = TrackerImportParams.builder().build(); preheat = new TrackerPreheat(); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java index a251928a66b0..2274ae89f00e 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java @@ -52,9 +52,9 @@ import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -97,10 +97,10 @@ void shouldPreheatEventAOCIfNotProvided() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); when(preheat.getProgram(event.getProgram())).thenReturn(program); - when(preheat.getIdSchemes()).thenReturn(identifierParams); options.forEach( o -> when(preheat.getCategoryOption(identifierParams.toMetadataIdentifier(o))) @@ -142,9 +142,9 @@ void shouldPreheatEventAOCIfNotProvidedAndEventHasProgramStageButNoProgram() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); - when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgramStage(event.getProgramStage())).thenReturn(stage); options.forEach( o -> @@ -183,9 +183,9 @@ void shouldPreheatEventAOCIfNotProvidedOnlyIfNotAlreadyFetched() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event, event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); - when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); options.forEach( o -> @@ -228,9 +228,9 @@ void shouldPreheatEventAOCEvenIfNotFound() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event, event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); - when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); options.forEach( o -> @@ -271,9 +271,9 @@ void shouldNotPreheatEventAOCIfNotProvidedAndCONotFound() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); - when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); when(categoryService.getCategoryOptionCombo(categoryCombo, aoc.getCategoryOptions())) .thenReturn(aoc); @@ -304,9 +304,8 @@ void shouldNotPreheatEventAOCIfEventHasNoProgram() { .programStage(MetadataIdentifier.EMPTY_UID) .build(); List events = List.of(event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); - - when(preheat.getIdSchemes()).thenReturn(identifierParams); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); supplier.preheatAdd(params, preheat); @@ -336,9 +335,8 @@ void shouldNotPreheatEventAOCIfEventHasNoProgramAndNoProgramStage() { .programStage(MetadataIdentifier.EMPTY_UID) .build(); List events = List.of(event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); - - when(preheat.getIdSchemes()).thenReturn(identifierParams); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); options.forEach( o -> @@ -376,9 +374,9 @@ void shouldNotPreheatEventAOCIfEventHasNoProgramAndItsProgramStageHasNoProgram() .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); - when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgramStage(event.getProgramStage())).thenReturn(stage); options.forEach( o -> @@ -414,9 +412,9 @@ void shouldNotPreheatEventAOCIfAOCAndCOsAreProvided() { .attributeOptionCombo(identifierParams.toMetadataIdentifier(aoc)) .build(); List events = List.of(event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); - when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); supplier.preheatAdd(params, preheat); @@ -445,9 +443,9 @@ void shouldNotPreheatEventAOCIfAOCIsProvided() { .attributeOptionCombo(identifierParams.toMetadataIdentifier(aoc)) .build(); List events = List.of(event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); - when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); supplier.preheatAdd(params, preheat); @@ -476,9 +474,9 @@ void shouldNotPreheatEventAOCIfNoCategoryOptionsProvided() { .attributeOptionCombo(identifierParams.toMetadataIdentifier((CategoryOptionCombo) null)) .build(); List events = List.of(event); - TrackerObjects params = TrackerObjects.builder().events(events).build(); + TrackerImportParams params = + TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); - when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); supplier.preheatAdd(params, preheat); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java index e34306bd2eeb..d5a67a2cb66e 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java @@ -43,13 +43,14 @@ import org.hisp.dhis.fileresource.FileResourceService; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -85,8 +86,8 @@ void testSupplierAddsFileResourcesReferencedByTeAttributes() { when(fileResourceService.getFileResources(List.of("kKacJUdANDC"))) .thenReturn(List.of(fileResource)); - TrackerObjects params = - TrackerObjects.builder() + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) .trackedEntities( List.of( trackedEntity(numericAttribute(), fileAttribute("hQKI6KcEu5t", "kKacJUdANDC")))) @@ -101,8 +102,8 @@ void testSupplierAddsFileResourcesReferencedByTeAttributes() { void testSupplierDoesNotAddFileResourceIfTeAttributeValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(teaFileResource("hQKI6KcEu5t"))); - TrackerObjects params = - TrackerObjects.builder() + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) .trackedEntities(List.of(trackedEntity(fileAttribute("hQKI6KcEu5t", "")))) .build(); @@ -121,8 +122,8 @@ void testSupplierAddsFileResourcesReferencedByEnrollmentAttributes() { when(fileResourceService.getFileResources(List.of("kKacJUdANDC"))) .thenReturn(List.of(fileResource)); - TrackerObjects params = - TrackerObjects.builder() + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) .enrollments( List.of( enrollment(numericAttribute(), fileAttribute("hQKI6KcEu5t", "kKacJUdANDC")))) @@ -143,8 +144,8 @@ void testSupplierAddsFileResourcesReferencedByEventDataElement() { when(fileResourceService.getFileResources(List.of("kKacJUdANDC"))) .thenReturn(List.of(fileResource)); - TrackerObjects params = - TrackerObjects.builder() + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) .events( List.of(event(dataValue("numeric", "2"), dataValue("hQKI6KcEu5t", "kKacJUdANDC")))) .build(); @@ -158,8 +159,10 @@ void testSupplierAddsFileResourcesReferencedByEventDataElement() { void testSupplierDoesNotAddFileResourceIfEventDataValueValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(fileDataElement("hQKI6KcEu5t"))); - TrackerObjects params = - TrackerObjects.builder().events(List.of(event(dataValue("hQKI6KcEu5t", "")))).build(); + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) + .events(List.of(event(dataValue("hQKI6KcEu5t", "")))) + .build(); supplier.preheatAdd(params, preheat); @@ -186,6 +189,10 @@ private FileResource fileResource(String uid) { return fileResource; } + private TrackerImportParams.TrackerImportParamsBuilder params(TrackerIdSchemeParams idSchemes) { + return TrackerImportParams.builder().idSchemes(idSchemes); + } + private Attribute numericAttribute() { return Attribute.builder() .attribute(MetadataIdentifier.ofUid("numeric")) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java index 9326f0ea7e24..d887a5538c29 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java @@ -43,13 +43,14 @@ import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -81,8 +82,8 @@ void testSupplierAddsOrgUnitReferencedByTeAttributes() { when(manager.getByUid(OrganisationUnit.class, List.of("kKacJUdANDC"))) .thenReturn(List.of(orgUnit)); - TrackerObjects params = - TrackerObjects.builder() + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) .trackedEntities( List.of( trackedEntity( @@ -98,8 +99,8 @@ void testSupplierAddsOrgUnitReferencedByTeAttributes() { void testSupplierDoesNotAddOrgUnitIfTeAttributeValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(teaOrgUnit("hQKI6KcEu5t"))); - TrackerObjects params = - TrackerObjects.builder() + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) .trackedEntities(List.of(trackedEntity(orgUnitAttribute("hQKI6KcEu5t", "")))) .build(); @@ -117,8 +118,8 @@ void testSupplierAddsOrgUnitReferencedByEnrollmentAttributes() { when(manager.getByUid(OrganisationUnit.class, List.of("kKacJUdANDC"))) .thenReturn(List.of(orgUnit)); - TrackerObjects params = - TrackerObjects.builder() + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) .enrollments( List.of( enrollment(numericAttribute(), orgUnitAttribute("hQKI6KcEu5t", "kKacJUdANDC")))) @@ -139,8 +140,8 @@ void testSupplierAddsOrgUnitReferencedByEventDataElement() { when(manager.getByUid(OrganisationUnit.class, List.of("kKacJUdANDC"))) .thenReturn(List.of(orgUnit)); - TrackerObjects params = - TrackerObjects.builder() + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) .events( List.of(event(dataValue("numeric", "2"), dataValue("hQKI6KcEu5t", "kKacJUdANDC")))) .build(); @@ -154,8 +155,10 @@ void testSupplierAddsOrgUnitReferencedByEventDataElement() { void testSupplierDoesNotAddOrgUnitIfEventDataValueValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(orgUnitDataElement("hQKI6KcEu5t"))); - TrackerObjects params = - TrackerObjects.builder().events(List.of(event(dataValue("hQKI6KcEu5t", "")))).build(); + TrackerImportParams params = + params(TrackerIdSchemeParams.builder().build()) + .events(List.of(event(dataValue("hQKI6KcEu5t", "")))) + .build(); supplier.preheatAdd(params, preheat); @@ -182,6 +185,10 @@ private OrganisationUnit orgUnit(String uid) { return orgUnit; } + private TrackerImportParams.TrackerImportParamsBuilder params(TrackerIdSchemeParams idSchemes) { + return TrackerImportParams.builder().idSchemes(idSchemes); + } + private Attribute numericAttribute() { return Attribute.builder() .attribute(MetadataIdentifier.ofUid("numeric")) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java index c9c06a56d47e..c2a6cde37893 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java @@ -36,7 +36,7 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodStore; import org.hisp.dhis.random.BeanRandomizer; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.DefaultPreheatCacheService; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; @@ -70,7 +70,7 @@ void verifySupplier() { final List periods = rnd.objects(Period.class, 20).collect(Collectors.toList()); when(periodStore.getAll()).thenReturn(periods); - final TrackerObjects params = TrackerObjects.builder().build(); + final TrackerImportParams params = TrackerImportParams.builder().build(); TrackerPreheat preheat = new TrackerPreheat(); this.supplier.preheatAdd(params, preheat); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java index 078b526715ac..99c86ac1f564 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java @@ -49,8 +49,8 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttributeService; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -77,7 +77,7 @@ class UniqueAttributeSupplierTest extends DhisConvenienceTest { @Mock private TrackedEntityAttributeValueService trackedEntityAttributeValueService; - private TrackerObjects params; + private TrackerImportParams params; private TrackerPreheat preheat; @@ -91,7 +91,7 @@ class UniqueAttributeSupplierTest extends DhisConvenienceTest { @BeforeEach public void setUp() { - params = TrackerObjects.builder().build(); + params = TrackerImportParams.builder().build(); preheat = new TrackerPreheat(); uniqueAttribute = createTrackedEntityAttribute('A', ValueType.TEXT); OrganisationUnit orgUnit = createOrganisationUnit('A'); @@ -121,8 +121,8 @@ void verifySupplierWhenNoUniqueAttributeIsPresentInTheSystem() { void verifySupplierWhenTeAndEnrollmentHaveTheSameUniqueAttribute() { when(trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes()) .thenReturn(Collections.singletonList(uniqueAttribute)); - TrackerObjects importParams = - TrackerObjects.builder() + TrackerImportParams importParams = + TrackerImportParams.builder() .trackedEntities(Collections.singletonList(trackedEntity())) .enrollments(Collections.singletonList(enrollment(TE_UID))) .build(); @@ -136,8 +136,8 @@ void verifySupplierWhenTeAndEnrollmentHaveTheSameUniqueAttribute() { void verifySupplierWhenTwoTesHaveAttributeWithSameUniqueValue() { when(trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes()) .thenReturn(Collections.singletonList(uniqueAttribute)); - TrackerObjects importParams = - TrackerObjects.builder().trackedEntities(sameUniqueAttributeTrackedEntities()).build(); + TrackerImportParams importParams = + TrackerImportParams.builder().trackedEntities(sameUniqueAttributeTrackedEntities()).build(); this.supplier.preheatAdd(importParams, preheat); @@ -148,8 +148,8 @@ void verifySupplierWhenTwoTesHaveAttributeWithSameUniqueValue() { void verifySupplierWhenTeAndEnrollmentFromAnotherTeHaveAttributeWithSameUniqueValue() { when(trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes()) .thenReturn(Collections.singletonList(uniqueAttribute)); - TrackerObjects importParams = - TrackerObjects.builder() + TrackerImportParams importParams = + TrackerImportParams.builder() .trackedEntities(Collections.singletonList(trackedEntity())) .enrollments(Collections.singletonList(enrollment(ANOTHER_TE_UID))) .build(); @@ -169,8 +169,8 @@ void verifySupplierWhenTeinPayloadAndDBHaveTheSameUniqueAttribute() { when(trackedEntityAttributeValueService.getUniqueAttributeByValues( trackedEntityAttributeListMap)) .thenReturn(attributeValues); - TrackerObjects importParams = - TrackerObjects.builder() + TrackerImportParams importParams = + TrackerImportParams.builder() .trackedEntities(Collections.singletonList(trackedEntity())) .build(); @@ -189,8 +189,8 @@ void verifySupplierWhenTeinPayloadAndAnotherTeInDBHaveTheSameUniqueAttribute() { when(trackedEntityAttributeValueService.getUniqueAttributeByValues( trackedEntityAttributeListMap)) .thenReturn(attributeValues); - TrackerObjects importParams = - TrackerObjects.builder() + TrackerImportParams importParams = + TrackerImportParams.builder() .trackedEntities(Collections.singletonList(anotherTrackedEntity())) .build(); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java index 96c9f3b8ab90..40539cd8d544 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java @@ -41,8 +41,8 @@ import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.random.BeanRandomizer; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.domain.User; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.user.UserService; @@ -97,7 +97,7 @@ void verifyUserSupplierByUid() { when(manager.getByUid(eq(org.hisp.dhis.user.User.class), argThat(t -> t.containsAll(userIds)))) .thenReturn(users); - final TrackerObjects params = TrackerObjects.builder().events(events).build(); + final TrackerImportParams params = TrackerImportParams.builder().events(events).build(); TrackerPreheat preheat = new TrackerPreheat(); this.supplier.preheatAdd(params, preheat); @@ -117,7 +117,7 @@ void verifyUserSupplierByUsername() { when(userService.getUsersByUsernames(argThat(t -> t.containsAll(usernames)))).thenReturn(users); - final TrackerObjects params = TrackerObjects.builder().events(events).build(); + final TrackerImportParams params = TrackerImportParams.builder().events(events).build(); TrackerPreheat preheat = new TrackerPreheat(); this.supplier.preheatAdd(params, preheat); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java index 679a55664aa9..c312d29bdfd7 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java @@ -33,6 +33,7 @@ import java.util.List; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityStore; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -54,6 +55,11 @@ class TrackerEntityStrategyTest { @Test void verifyStrategyAddRightTeToPreheat() { + final List trackedEntities = + trackedEntities(); + final TrackerImportParams params = + TrackerImportParams.builder().trackedEntities(trackedEntities).build(); + final List uids = List.of("TEIA", "TEIB"); List> splitUids = new ArrayList<>(); @@ -65,7 +71,7 @@ void verifyStrategyAddRightTeToPreheat() { teB.setUid("TEIB"); List dbTrackedEntities = List.of(teA, teB); when(trackedEntityStore.getIncludingDeleted(uids)).thenReturn(dbTrackedEntities); - strategy.add(splitUids, preheat); + strategy.add(params, splitUids, preheat); Mockito.verify(trackedEntityStore).getIncludingDeleted(uids); Mockito.verify(preheat).putTrackedEntities(dbTrackedEntities); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java index 7d031bb72fe9..ef6e59e58bef 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java @@ -57,6 +57,8 @@ void testImportCalculatesIgnoredValues() { // Create validation report with 3 objects ValidationReport validationReport = ValidationReport.emptyReport(); validationReport.addErrors(rnd.objects(Error.class, 3).collect(Collectors.toList())); + // Create empty Timing Stats report + TimingsStats timingsStats = new TimingsStats(); // Create payload map Map originalPayload = new HashMap<>(); originalPayload.put(TrackerType.TRACKED_ENTITY, 10); @@ -64,7 +66,7 @@ void testImportCalculatesIgnoredValues() { // Method under test ImportReport rep = ImportReport.withImportCompleted( - Status.OK, persistenceReport, validationReport, originalPayload); + Status.OK, persistenceReport, validationReport, timingsStats, originalPayload); assertThat(rep.getStats().getCreated(), is(8)); assertThat(rep.getStats().getUpdated(), is(6)); assertThat(rep.getStats().getIgnored(), is(3)); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java index 0ecabc5ed491..9fac55491548 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java @@ -28,9 +28,17 @@ package org.hisp.dhis.tracker.imports.report; import static org.hisp.dhis.tracker.TrackerType.TRACKED_ENTITY; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.COMMIT_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREHEAT_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREPARE_REQUEST_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.PROGRAMRULE_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.TOTAL_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.TOTAL_REQUEST_OPS; +import static org.hisp.dhis.tracker.imports.report.TimingsStats.VALIDATION_OPS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import com.fasterxml.jackson.core.JsonProcessingException; @@ -84,6 +92,7 @@ void testImportReportErrors() { assertNotNull(report.getValidationReport()); assertTrue(report.getValidationReport().hasErrors()); assertFalse(report.getValidationReport().hasWarnings()); + assertNull(report.getTimingsStats()); } @Test @@ -97,6 +106,7 @@ void testImportReportWarnings() { assertNotNull(report.getValidationReport()); assertTrue(report.getValidationReport().hasErrors()); assertTrue(report.getValidationReport().hasWarnings()); + assertNull(report.getTimingsStats()); } @Test @@ -109,6 +119,12 @@ void testImportReportFull() { assertNotNull(report.getValidationReport()); assertTrue(report.getValidationReport().hasErrors()); assertTrue(report.getValidationReport().hasWarnings()); + assertNotNull(report.getTimingsStats()); + assertEquals("1 sec.", report.getTimingsStats().getProgramRule()); + assertEquals("2 sec.", report.getTimingsStats().getCommit()); + assertEquals("3 sec.", report.getTimingsStats().getPreheat()); + assertEquals("4 sec.", report.getTimingsStats().getValidation()); + assertEquals("10 sec.", report.getTimingsStats().getTotalImport()); } @Test @@ -125,7 +141,15 @@ void testSerializingAndDeserializingImportReport() throws JsonProcessingExceptio typeReport.getStats().setDeleted(3); typeReportMap.put(TRACKED_ENTITY, typeReport); PersistenceReport persistenceReport = new PersistenceReport(typeReportMap); - + // Build TimingsStats + TimingsStats timingsStats = new TimingsStats(); + timingsStats.set(COMMIT_OPS, "0.1 sec."); + timingsStats.set(PREHEAT_OPS, "0.2 sec."); + timingsStats.set(PROGRAMRULE_OPS, "0.3 sec."); + timingsStats.set(TOTAL_OPS, "0.4 sec."); + timingsStats.set(VALIDATION_OPS, "4 sec."); + timingsStats.set(PREPARE_REQUEST_OPS, "0.5 sec."); + timingsStats.set(TOTAL_REQUEST_OPS, "0.6 sec."); // Build ValidationReport ValidationReport tvr = ValidationReport.emptyReport(); @@ -147,7 +171,8 @@ void testSerializingAndDeserializingImportReport() throws JsonProcessingExceptio final Map bundleSize = new HashMap<>(); bundleSize.put(TRACKED_ENTITY, 1); ImportReport toSerializeReport = - ImportReport.withImportCompleted(Status.ERROR, persistenceReport, tvr, bundleSize); + ImportReport.withImportCompleted( + Status.ERROR, persistenceReport, tvr, timingsStats, bundleSize); // Serialize TrackerImportReport into String String jsonString = jsonMapper.writeValueAsString(toSerializeReport); // Deserialize the String back into TrackerImportReport @@ -219,7 +244,28 @@ void testSerializingAndDeserializingImportReport() throws JsonProcessingExceptio assertEquals( toSerializeReport.getValidationReport().getWarnings().get(0).getTrackerType(), deserializedReport.getValidationReport().getWarnings().get(0).getTrackerType()); - + // Verify TimingsStats + assertEquals( + toSerializeReport.getTimingsStats().getCommit(), + deserializedReport.getTimingsStats().getCommit()); + assertEquals( + toSerializeReport.getTimingsStats().getPreheat(), + deserializedReport.getTimingsStats().getPreheat()); + assertEquals( + toSerializeReport.getTimingsStats().getPrepareRequest(), + deserializedReport.getTimingsStats().getPrepareRequest()); + assertEquals( + toSerializeReport.getTimingsStats().getProgramRule(), + deserializedReport.getTimingsStats().getProgramRule()); + assertEquals( + toSerializeReport.getTimingsStats().getTotalImport(), + deserializedReport.getTimingsStats().getTotalImport()); + assertEquals( + toSerializeReport.getTimingsStats().getTotalRequest(), + deserializedReport.getTimingsStats().getTotalRequest()); + assertEquals( + toSerializeReport.getTimingsStats().getValidation(), + deserializedReport.getTimingsStats().getValidation()); assertEquals(toSerializeReport.getStats(), deserializedReport.getStats()); } @@ -235,7 +281,17 @@ private ImportReport createImportReport() { final Map bundleSize = new HashMap<>(); bundleSize.put(TRACKED_ENTITY, 1); return ImportReport.withImportCompleted( - Status.OK, createBundleReport(), createValidationReport(), bundleSize); + Status.OK, createBundleReport(), createValidationReport(), createTimingStats(), bundleSize); + } + + private TimingsStats createTimingStats() { + TimingsStats timingsStats = new TimingsStats(); + timingsStats.set(PROGRAMRULE_OPS, "1 sec."); + timingsStats.set(COMMIT_OPS, "2 sec."); + timingsStats.set(PREHEAT_OPS, "3 sec."); + timingsStats.set(VALIDATION_OPS, "4 sec."); + timingsStats.set(TOTAL_OPS, "10 sec."); + return timingsStats; } private ValidationReport createValidationReport() { diff --git a/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java b/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java index 47cfb12c81ed..94e394d1fa67 100644 --- a/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java +++ b/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java @@ -92,10 +92,6 @@ public TrackerApiResponse postAndGetJobReport( return getJobReportByImportResponse(response); } - public ApiResponse checkJobReport(String jobId, String reportMode) { - return this.get(String.format("/jobs/%s/report?reportMode=%s", jobId, reportMode)); - } - public TrackerApiResponse getJobReport(String jobId, String reportMode) { ApiResponse response = this.get(String.format("/jobs/%s/report?reportMode=%s", jobId, reportMode)); @@ -193,10 +189,6 @@ private TrackerApiResponse getJobReportByImportResponse(ApiResponse response) { this.waitUntilJobIsCompleted(jobId); - Callable jobIsCompleted = () -> this.checkJobReport(jobId, "FULL").statusCode(); - - with().atMost(21, TimeUnit.SECONDS).await().until(() -> jobIsCompleted.call() == 200); - return this.getJobReport(jobId, "FULL"); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java index f4cc60be6c72..7d9e651125c2 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java @@ -53,7 +53,6 @@ import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.junit.jupiter.api.BeforeEach; @@ -76,9 +75,9 @@ class AclEventExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); User userA = userService.getUser("M5zQapPyTZI"); - TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); assertNoErrors( - trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); + trackerImportService.importTracker( + fromJson("tracker/event_and_enrollment.json", userA.getUid()))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); ProgramStage programStage = get(ProgramStage.class, "NpsdDv6kKSO"); program = programStage.getProgram(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java index fe5f8e89b73b..2e12ed6d11e1 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java @@ -44,7 +44,7 @@ import org.hisp.dhis.render.RenderFormat; import org.hisp.dhis.render.RenderService; import org.hisp.dhis.test.integration.SingleSetupIntegrationTestBase; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -107,8 +107,26 @@ protected ObjectBundle setUpMetadata(String path, User user) throws IOException return bundle; } - protected TrackerObjects fromJson(String path) throws IOException { + protected TrackerImportParams fromJson(String path) throws IOException { + TrackerImportParams trackerImportParams = _fromJson(path); + trackerImportParams.setUser(currentUserService.getCurrentUser()); + return trackerImportParams; + } + + protected TrackerImportParams fromJson(String path, String userUid) throws IOException { + TrackerImportParams trackerImportParams = _fromJson(path); + trackerImportParams.setUserId(userUid); + return trackerImportParams; + } + + protected TrackerImportParams fromJson(String path, User user) throws IOException { + TrackerImportParams trackerImportParams = _fromJson(path); + trackerImportParams.setUser(user); + return trackerImportParams; + } + + private TrackerImportParams _fromJson(String path) throws IOException { return renderService.fromJson( - new ClassPathResource(path).getInputStream(), TrackerObjects.class); + new ClassPathResource(path).getInputStream(), TrackerImportParams.class); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java index 6a6c1fcbf173..28c706005044 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java @@ -74,7 +74,6 @@ import org.hisp.dhis.tracker.export.relationship.RelationshipService; import org.hisp.dhis.tracker.export.trackedentity.TrackedEntityOperationParams; import org.hisp.dhis.tracker.export.trackedentity.TrackedEntityService; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.hisp.dhis.webapi.controller.event.mapper.SortDirection; @@ -111,9 +110,9 @@ class OrderAndPaginationExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); importUser = userService.getUser("M5zQapPyTZI"); - TrackerImportParams params = TrackerImportParams.builder().userId(importUser.getUid()).build(); assertNoErrors( - trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); + trackerImportService.importTracker( + fromJson("tracker/event_and_enrollment.json", importUser.getUid()))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); programStage = get(ProgramStage.class, "NpsdDv6kKSO"); trackedEntityType = get(TrackedEntityType.class, "ja8NY4PW7Xm"); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java index edfe77fef37e..c2bd259a0c20 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java @@ -59,7 +59,6 @@ import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.junit.jupiter.api.BeforeEach; @@ -85,9 +84,9 @@ class AclEventExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); User userA = userService.getUser("M5zQapPyTZI"); - TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); assertNoErrors( - trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); + trackerImportService.importTracker( + fromJson("tracker/event_and_enrollment.json", userA.getUid()))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); ProgramStage programStage = get(ProgramStage.class, "NpsdDv6kKSO"); program = programStage.getProgram(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java index e99448529462..33ebe1e366ef 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java @@ -72,7 +72,6 @@ import org.hisp.dhis.relationship.RelationshipItem; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.hisp.dhis.util.DateUtils; @@ -109,9 +108,9 @@ class EventExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); importUser = userService.getUser("M5zQapPyTZI"); - TrackerImportParams params = TrackerImportParams.builder().userId(importUser.getUid()).build(); assertNoErrors( - trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); + trackerImportService.importTracker( + fromJson("tracker/event_and_enrollment.json", importUser.getUid()))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); programStage = get(ProgramStage.class, "NpsdDv6kKSO"); program = programStage.getProgram(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java index 9f6ea3eff68c..da06b0dad95d 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java @@ -34,7 +34,6 @@ import java.io.IOException; import org.hisp.dhis.trackedentity.TrackedEntityService; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.junit.jupiter.api.Test; @@ -53,12 +52,10 @@ public void initTest() throws IOException { @Test void testImportSuccessWithAtomicModeObjectIfThereIsAnErrorInOneTEI() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/one_valid_tei_and_one_invalid.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).build(); + TrackerImportParams params = fromJson("tracker/one_valid_tei_and_one_invalid.json"); + params.setAtomicMode(AtomicMode.OBJECT); - ImportReport trackerImportTeiReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); assertNotNull(trackerImportTeiReport); assertEquals(Status.OK, trackerImportTeiReport.getStatus()); @@ -69,11 +66,10 @@ void testImportSuccessWithAtomicModeObjectIfThereIsAnErrorInOneTEI() throws IOEx @Test void testImportFailWithAtomicModeAllIfThereIsAnErrorInOneTEI() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/one_valid_tei_and_one_invalid.json"); - TrackerImportParams params = TrackerImportParams.builder().atomicMode(AtomicMode.ALL).build(); + TrackerImportParams params = fromJson("tracker/one_valid_tei_and_one_invalid.json"); + params.setAtomicMode(AtomicMode.ALL); - ImportReport trackerImportTeiReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); assertNotNull(trackerImportTeiReport); assertEquals(Status.ERROR, trackerImportTeiReport.getStatus()); assertEquals(1, trackerImportTeiReport.getValidationReport().getErrors().size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java index 0ae89946dddc..21edc0b6da59 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import java.io.IOException; @@ -82,7 +83,12 @@ void testJsonSerialization() throws Exception { + "\"validationMode\":\"SKIP\"," + "\"skipPatternValidation\":false," + "\"skipSideEffects\":false," - + "\"skipRuleEngine\":true}", + + "\"skipRuleEngine\":true," + + "\"trackedEntities\":[]," + + "\"enrollments\":[]," + + "\"events\":[]," + + "\"relationships\":[]," + + "\"username\":\"system-process\"}", json, JSONCompareMode.LENIENT); } @@ -105,7 +111,12 @@ void testJsonDeserialization() throws IOException { + "\"validationMode\":\"SKIP\"," + "\"skipPatternValidation\":true," + "\"skipSideEffects\":true," - + "\"skipRuleEngine\":true}"; + + "\"skipRuleEngine\":true," + + "\"trackedEntities\":[]," + + "\"enrollments\":[]," + + "\"events\":[]," + + "\"relationships\":[]," + + "\"username\":\"system-process\"}"; final TrackerImportParams trackerImportParams = renderService.fromJson(json, TrackerImportParams.class); @@ -118,6 +129,7 @@ void testJsonDeserialization() throws IOException { assertThat(trackerImportParams.isSkipPatternValidation(), is(true)); assertThat(trackerImportParams.isSkipSideEffects(), is(true)); assertThat(trackerImportParams.isSkipRuleEngine(), is(true)); + assertThat(trackerImportParams.getUser(), is(nullValue())); TrackerIdSchemeParams idSchemes = trackerImportParams.getIdSchemes(); assertThat(idSchemes.getIdScheme(), is(TrackerIdSchemeParam.CODE)); assertThat(idSchemes.getProgramIdScheme().getIdScheme(), is(TrackerIdScheme.ATTRIBUTE)); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java index 8b5ef6f4e2f1..bd652e88b4df 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java @@ -45,7 +45,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.junit.jupiter.api.Test; @@ -67,11 +66,12 @@ protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); final User userA = userService.getUser("M5zQapPyTZI"); injectSecurityContext(userA); - TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - assertNoErrors(trackerImportService.importTracker(params, trackerObjects)); - TrackerObjects enTrackerObjects = fromJson("tracker/single_enrollment.json"); - assertNoErrors(trackerImportService.importTracker(params, enTrackerObjects)); + + TrackerImportParams teiParams = fromJson("tracker/single_tei.json", userA.getUid()); + assertNoErrors(trackerImportService.importTracker(teiParams)); + TrackerImportParams enrollmentParams = + fromJson("tracker/single_enrollment.json", userA.getUid()); + assertNoErrors(trackerImportService.importTracker(enrollmentParams)); manager.flush(); } @@ -79,7 +79,7 @@ protected void initTest() throws IOException { void successWhenEventHasNoProgramAndHasProgramStage() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events-with_no_program.json")); + fromJson("tracker/validations/events-with_no_program.json")); assertNoErrors(importReport); } @@ -87,8 +87,7 @@ void successWhenEventHasNoProgramAndHasProgramStage() throws IOException { @Test void testEventDataValue() throws IOException { ImportReport importReport = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/event_with_data_values.json")); + trackerImportService.importTracker(fromJson("tracker/event_with_data_values.json")); assertNoErrors(importReport); List events = manager.getAll(Event.class); @@ -100,9 +99,8 @@ void testEventDataValue() throws IOException { @Test void testEventDataValueUpdate() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/event_with_data_values.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = + trackerImportService.importTracker(fromJson("tracker/event_with_data_values.json")); assertNoErrors(importReport); List events = manager.getAll(Event.class); @@ -111,10 +109,17 @@ void testEventDataValueUpdate() throws IOException { Set eventDataValues = event.getEventDataValues(); assertEquals(4, eventDataValues.size()); // update - - TrackerObjects updatedTrackerObjects = fromJson("tracker/event_with_updated_data_values.json"); - params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(params, updatedTrackerObjects); + TrackerImportParams trackerImportParams = + fromJson("tracker/event_with_updated_data_values.json"); + // make sure that the uid property is populated as well - otherwise + // update will + // not work + trackerImportParams + .getEvents() + .get(0) + .setEvent(trackerImportParams.getEvents().get(0).getEvent()); + trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); List updatedEvents = manager.getAll(Event.class); assertEquals(1, updatedEvents.size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java index e04fe595b412..af021c5f645b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java @@ -44,7 +44,6 @@ import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.EnrollmentStatus; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -62,19 +61,16 @@ class LastUpdateImportTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); injectAdminUser(); - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - assertNoErrors(trackerImportService.importTracker(new TrackerImportParams(), trackerObjects)); - trackedEntity = trackerObjects.getTrackedEntities().get(0); - assertNoErrors( - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/single_enrollment.json"))); + TrackerImportParams trackerImportParams = fromJson("tracker/single_tei.json"); + assertNoErrors(trackerImportService.importTracker(trackerImportParams)); + trackedEntity = trackerImportParams.getTrackedEntities().get(0); + assertNoErrors(trackerImportService.importTracker(fromJson("tracker/single_enrollment.json"))); manager.flush(); } @Test void shouldUpdateTeiIfTeiIsUpdated() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - TrackerImportParams trackerImportParams = new TrackerImportParams(); + TrackerImportParams trackerImportParams = fromJson("tracker/single_tei.json"); trackerImportParams.setImportStrategy(TrackerImportStrategy.UPDATE); Attribute attribute = Attribute.builder() @@ -84,7 +80,7 @@ void shouldUpdateTeiIfTeiIsUpdated() throws IOException { trackedEntity.setAttributes(Collections.singletonList(attribute)); Date lastUpdateBefore = trackedEntityService.getTrackedEntity(trackedEntity.getTrackedEntity()).getLastUpdated(); - assertNoErrors(trackerImportService.importTracker(trackerImportParams, trackerObjects)); + assertNoErrors(trackerImportService.importTracker(trackerImportParams)); assertTrue( manager .get(TrackedEntity.class, trackedEntity.getTrackedEntity()) @@ -95,15 +91,14 @@ void shouldUpdateTeiIfTeiIsUpdated() throws IOException { @Test void shouldUpdateTeiIfEventIsUpdated() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/event_with_data_values.json"); - TrackerImportParams trackerImportParams = new TrackerImportParams(); + TrackerImportParams trackerImportParams = fromJson("tracker/event_with_data_values.json"); Date lastUpdateBefore = trackedEntityService.getTrackedEntity(trackedEntity.getTrackedEntity()).getLastUpdated(); - assertNoErrors(trackerImportService.importTracker(trackerImportParams, trackerObjects)); + assertNoErrors(trackerImportService.importTracker(trackerImportParams)); - trackerObjects = fromJson("tracker/event_with_updated_data_values.json"); + trackerImportParams = fromJson("tracker/event_with_updated_data_values.json"); trackerImportParams.setImportStrategy(TrackerImportStrategy.UPDATE); - assertNoErrors(trackerImportService.importTracker(trackerImportParams, trackerObjects)); + assertNoErrors(trackerImportService.importTracker(trackerImportParams)); manager.clear(); assertTrue( manager @@ -115,15 +110,13 @@ void shouldUpdateTeiIfEventIsUpdated() throws IOException { @Test void shouldUpdateTeiIfEnrollmentIsUpdated() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_enrollment.json"); - TrackerImportParams trackerImportParams = new TrackerImportParams(); + TrackerImportParams trackerImportParams = fromJson("tracker/single_enrollment.json"); Date lastUpdateBefore = trackedEntityService.getTrackedEntity(trackedEntity.getTrackedEntity()).getLastUpdated(); - Enrollment enrollment = trackerObjects.getEnrollments().get(0); + Enrollment enrollment = trackerImportParams.getEnrollments().get(0); enrollment.setStatus(EnrollmentStatus.COMPLETED); trackerImportParams.setImportStrategy(TrackerImportStrategy.UPDATE); - ImportReport importReport = - trackerImportService.importTracker(trackerImportParams, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); manager.clear(); assertTrue( diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java index 017ca502bac7..9c2517c0ad18 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java @@ -52,7 +52,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; import org.hisp.dhis.tracker.imports.domain.EnrollmentStatus; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.validation.ValidationCode; import org.hisp.dhis.user.User; @@ -81,16 +80,18 @@ protected void initTest() throws IOException { injectSecurityContext(superUser); nonSuperUser = userService.getUser("Tu9fv8ezgHl"); - TrackerImportParams params = TrackerImportParams.builder().userId(superUser.getUid()).build(); assertNoErrors( - trackerImportService.importTracker(params, fromJson("tracker/ownership_tei.json"))); + trackerImportService.importTracker( + fromJson("tracker/ownership_tei.json", superUser.getUid()))); assertNoErrors( - trackerImportService.importTracker(params, fromJson("tracker/ownership_enrollment.json"))); + trackerImportService.importTracker( + fromJson("tracker/ownership_enrollment.json", superUser.getUid()))); } @Test void testProgramOwnerWhenEnrolled() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); + TrackerImportParams enrollmentParams = + fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -103,11 +104,15 @@ void testProgramOwnerWhenEnrolled() throws IOException { assertNotNull(tepo.getTrackedEntity()); assertNotNull(tepo.getProgram()); assertNotNull(tepo.getOrganisationUnit()); - assertTrue(trackerObjects.getEnrollments().get(0).getProgram().isEqualTo(tepo.getProgram())); + assertTrue(enrollmentParams.getEnrollments().get(0).getProgram().isEqualTo(tepo.getProgram())); assertTrue( - trackerObjects.getEnrollments().get(0).getOrgUnit().isEqualTo(tepo.getOrganisationUnit())); + enrollmentParams + .getEnrollments() + .get(0) + .getOrgUnit() + .isEqualTo(tepo.getOrganisationUnit())); assertEquals( - trackerObjects.getEnrollments().get(0).getTrackedEntity(), + enrollmentParams.getEnrollments().get(0).getTrackedEntity(), tepo.getTrackedEntity().getUid()); } @@ -115,13 +120,14 @@ void testProgramOwnerWhenEnrolled() throws IOException { void testClientDatesForTeiEnrollmentEvent() throws IOException { User nonSuperUser = userService.getUser(this.nonSuperUser.getUid()); injectSecurityContext(nonSuperUser); - TrackerImportParams params = - TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); - TrackerObjects trackerObjects = fromJson("tracker/ownership_event.json"); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + + TrackerImportParams trackerImportParams = + fromJson("tracker/ownership_event.json", nonSuperUser); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); manager.flush(); - TrackerObjects teTrackerObjects = fromJson("tracker/ownership_tei.json"); - TrackerObjects enTrackerObjects = fromJson("tracker/ownership_enrollment.json"); + TrackerImportParams teParams = fromJson("tracker/ownership_tei.json", nonSuperUser); + TrackerImportParams enrollmentParams = + fromJson("tracker/ownership_enrollment.json", nonSuperUser); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -130,10 +136,10 @@ void testClientDatesForTeiEnrollmentEvent() throws IOException { assertNotNull(te.getCreatedAtClient()); assertNotNull(te.getLastUpdatedAtClient()); assertEquals( - DateUtils.fromInstant(teTrackerObjects.getTrackedEntities().get(0).getCreatedAtClient()), + DateUtils.fromInstant(teParams.getTrackedEntities().get(0).getCreatedAtClient()), te.getCreatedAtClient()); assertEquals( - DateUtils.fromInstant(teTrackerObjects.getTrackedEntities().get(0).getUpdatedAtClient()), + DateUtils.fromInstant(teParams.getTrackedEntities().get(0).getUpdatedAtClient()), te.getLastUpdatedAtClient()); Set enrollments = te.getEnrollments(); assertEquals(1, enrollments.size()); @@ -141,10 +147,10 @@ void testClientDatesForTeiEnrollmentEvent() throws IOException { assertNotNull(enrollment.getCreatedAtClient()); assertNotNull(enrollment.getLastUpdatedAtClient()); assertEquals( - DateUtils.fromInstant(enTrackerObjects.getEnrollments().get(0).getCreatedAtClient()), + DateUtils.fromInstant(enrollmentParams.getEnrollments().get(0).getCreatedAtClient()), enrollment.getCreatedAtClient()); assertEquals( - DateUtils.fromInstant(enTrackerObjects.getEnrollments().get(0).getUpdatedAtClient()), + DateUtils.fromInstant(enrollmentParams.getEnrollments().get(0).getUpdatedAtClient()), enrollment.getLastUpdatedAtClient()); Set events = enrollment.getEvents(); assertEquals(1, events.size()); @@ -152,35 +158,34 @@ void testClientDatesForTeiEnrollmentEvent() throws IOException { assertNotNull(event.getCreatedAtClient()); assertNotNull(event.getLastUpdatedAtClient()); assertEquals( - DateUtils.fromInstant(trackerObjects.getEvents().get(0).getCreatedAtClient()), + DateUtils.fromInstant(trackerImportParams.getEvents().get(0).getCreatedAtClient()), event.getCreatedAtClient()); assertEquals( - DateUtils.fromInstant(trackerObjects.getEvents().get(0).getUpdatedAtClient()), + DateUtils.fromInstant(trackerImportParams.getEvents().get(0).getUpdatedAtClient()), event.getLastUpdatedAtClient()); } @Test void testUpdateEnrollment() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); - TrackerImportParams params = - TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerImportParams enrollmentParams = + fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); Enrollment enrollment = enrollments.stream().filter(e -> e.getUid().equals("TvctPPhpD8u")).findAny().get(); - compareEnrollmentBasicProperties(enrollment, trackerObjects.getEnrollments().get(0)); + compareEnrollmentBasicProperties(enrollment, enrollmentParams.getEnrollments().get(0)); assertNull(enrollment.getCompletedBy()); assertNull(enrollment.getCompletedDate()); org.hisp.dhis.tracker.imports.domain.Enrollment updatedEnrollment = - trackerObjects.getEnrollments().get(0); + enrollmentParams.getEnrollments().get(0); updatedEnrollment.setStatus(EnrollmentStatus.COMPLETED); updatedEnrollment.setCreatedAtClient(Instant.now()); updatedEnrollment.setUpdatedAtClient(Instant.now()); updatedEnrollment.setEnrolledAt(Instant.now()); updatedEnrollment.setOccurredAt(Instant.now()); - params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); + enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); manager.flush(); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getUpdated()); @@ -194,14 +199,13 @@ void testUpdateEnrollment() throws IOException { @Test void testDeleteEnrollment() throws IOException { - TrackerImportParams params = - TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); - TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); + TrackerImportParams enrollmentParams = + fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); enrollments.stream().filter(e -> e.getUid().equals("TvctPPhpD8u")).findAny().get(); - params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); + enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getDeleted()); enrollments = manager.getAll(Enrollment.class); @@ -211,20 +215,19 @@ void testDeleteEnrollment() throws IOException { @Test void testCreateEnrollmentAfterDeleteEnrollment() throws IOException { injectSecurityContext(userService.getUser(nonSuperUser.getUid())); - TrackerImportParams params = - TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); - TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); + TrackerImportParams enrollmentParams = + fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); - params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); + enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getDeleted()); enrollments = manager.getAll(Enrollment.class); assertEquals(1, enrollments.size()); - params.setImportStrategy(TrackerImportStrategy.CREATE); - trackerObjects.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); - updatedReport = trackerImportService.importTracker(params, trackerObjects); + enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE); + enrollmentParams.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); + updatedReport = trackerImportService.importTracker(enrollmentParams); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getCreated()); enrollments = manager.getAll(Enrollment.class); @@ -234,22 +237,21 @@ void testCreateEnrollmentAfterDeleteEnrollment() throws IOException { @Test void testCreateEnrollmentWithoutOwnership() throws IOException { injectSecurityContext(userService.getUser(nonSuperUser.getUid())); - TrackerImportParams params = - TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); - TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); + TrackerImportParams enrollmentParams = + fromJson("tracker/ownership_enrollment.json", nonSuperUser); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); - params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); + enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getDeleted()); TrackedEntity te = manager.get(TrackedEntity.class, "IOR1AXXl24H"); OrganisationUnit ou = manager.get(OrganisationUnit.class, "B1nCbRV3qtP"); Program pgm = manager.get(Program.class, "BFcipDERJnf"); trackerOwnershipManager.transferOwnership(te, pgm, ou, true, false); - params.setImportStrategy(TrackerImportStrategy.CREATE); - trackerObjects.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); - updatedReport = trackerImportService.importTracker(params, trackerObjects); + enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE); + enrollmentParams.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); + updatedReport = trackerImportService.importTracker(enrollmentParams); assertEquals(1, updatedReport.getStats().getIgnored()); assertHasError(updatedReport, ValidationCode.E1102); } @@ -260,12 +262,11 @@ void testDeleteEnrollmentWithoutOwnership() throws IOException { TrackedEntity te = manager.get(TrackedEntity.class, "IOR1AXXl24H"); OrganisationUnit ou = manager.get(OrganisationUnit.class, "B1nCbRV3qtP"); Program pgm = manager.get(Program.class, "BFcipDERJnf"); - TrackerImportParams params = - TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); - TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); + TrackerImportParams enrollmentParams = + fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); trackerOwnershipManager.transferOwnership(te, pgm, ou, true, false); - params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); + enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); assertEquals(1, updatedReport.getStats().getIgnored()); assertHasError(updatedReport, ValidationCode.E1102); } @@ -277,11 +278,10 @@ void testUpdateEnrollmentWithoutOwnership() throws IOException { OrganisationUnit ou = manager.get(OrganisationUnit.class, "B1nCbRV3qtP"); Program pgm = manager.get(Program.class, "BFcipDERJnf"); trackerOwnershipManager.transferOwnership(te, pgm, ou, true, false); - TrackerImportParams params = - TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); - TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); - params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); + TrackerImportParams enrollmentParams = + fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); assertEquals(1, updatedReport.getStats().getIgnored()); assertHasError(updatedReport, ValidationCode.E1102); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java index c617089cb10c..fb8daad5335f 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java @@ -37,7 +37,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.hisp.dhis.user.User; @@ -59,33 +58,31 @@ class RelationshipImportTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); userA = userService.getUser("M5zQapPyTZI"); - TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); - assertNoErrors(trackerImportService.importTracker(params, fromJson("tracker/single_tei.json"))); assertNoErrors( - trackerImportService.importTracker(params, fromJson("tracker/single_enrollment.json"))); + trackerImportService.importTracker(fromJson("tracker/single_tei.json", userA.getUid()))); assertNoErrors( - trackerImportService.importTracker(params, fromJson("tracker/single_event.json"))); + trackerImportService.importTracker( + fromJson("tracker/single_enrollment.json", userA.getUid()))); + assertNoErrors( + trackerImportService.importTracker(fromJson("tracker/single_event.json", userA.getUid()))); manager.flush(); } @Test void successImportingRelationships() throws IOException { - ImportReport importReport = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/relationships.json")); + TrackerImportParams trackerImportParams = fromJson("tracker/relationships.json"); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertThat(importReport.getStatus(), is(Status.OK)); assertThat(importReport.getStats().getCreated(), is(2)); } @Test void successUpdateRelationships() throws IOException { - TrackerImportParams trackerImportParams = new TrackerImportParams(); - TrackerObjects trackerObjects = fromJson("tracker/relationships.json"); - trackerImportService.importTracker(trackerImportParams, trackerObjects); - trackerObjects = fromJson("tracker/relationshipToUpdate.json"); + TrackerImportParams trackerImportParams = fromJson("tracker/relationships.json"); + trackerImportService.importTracker(trackerImportParams); + trackerImportParams = fromJson("tracker/relationshipToUpdate.json"); trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = - trackerImportService.importTracker(trackerImportParams, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertThat(importReport.getStatus(), is(Status.OK)); assertThat(importReport.getStats().getCreated(), is(0)); assertThat(importReport.getStats().getIgnored(), is(1)); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java index b3e5a208b125..ed4ca445cb27 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java @@ -41,7 +41,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.validation.ValidationCode; @@ -59,13 +58,12 @@ class ReportSummaryDeleteIntegrationTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/tracker_basic_metadata.json"); injectAdminUser(); - TrackerObjects trackerObjects = fromJson("tracker/tracker_basic_data_before_deletion.json"); - assertEquals(13, trackerObjects.getTrackedEntities().size()); - assertEquals(2, trackerObjects.getEnrollments().size()); - assertEquals(2, trackerObjects.getEvents().size()); + TrackerImportParams params = fromJson("tracker/tracker_basic_data_before_deletion.json"); + assertEquals(13, params.getTrackedEntities().size()); + assertEquals(2, params.getEnrollments().size()); + assertEquals(2, params.getEvents().size()); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); PersistenceReport persistenceReport = importReport.getPersistenceReport(); assertImportedObjects(13, persistenceReport, TrackerType.TRACKED_ENTITY); @@ -79,12 +77,11 @@ protected void initTest() throws IOException { @Test void testTrackedEntityDeletion() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/tracked_entity_basic_data_for_deletion.json"); - TrackerImportParams params = new TrackerImportParams(); + TrackerImportParams params = fromJson("tracker/tracked_entity_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - assertEquals(9, trackerObjects.getTrackedEntities().size()); + assertEquals(9, params.getTrackedEntities().size()); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); assertDeletedObjects(9, importReport.getPersistenceReport(), TrackerType.TRACKED_ENTITY); // remaining @@ -96,11 +93,10 @@ void testTrackedEntityDeletion() throws IOException { void testEnrollmentDeletion() throws IOException { dbmsManager.clearSession(); assertEquals(2, manager.getAll(Event.class).size()); - TrackerImportParams params = new TrackerImportParams(); - TrackerObjects trackerObjects = fromJson("tracker/enrollment_basic_data_for_deletion.json"); + TrackerImportParams params = fromJson("tracker/enrollment_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); assertDeletedObjects(1, importReport.getPersistenceReport(), TrackerType.ENROLLMENT); @@ -112,11 +108,10 @@ void testEnrollmentDeletion() throws IOException { @Test void testEventDeletion() throws IOException { - TrackerImportParams params = new TrackerImportParams(); - TrackerObjects trackerObjects = fromJson("tracker/event_basic_data_for_deletion.json"); + TrackerImportParams params = fromJson("tracker/event_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); assertDeletedObjects(1, importReport.getPersistenceReport(), TrackerType.EVENT); @@ -126,23 +121,21 @@ void testEventDeletion() throws IOException { @Test void testNonExistentEnrollment() throws IOException { - TrackerImportParams params = new TrackerImportParams(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/non_existent_enrollment_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasError(importReport, ValidationCode.E1081); } @Test void testDeleteMultipleEntities() throws IOException { - TrackerImportParams params = new TrackerImportParams(); - TrackerObjects trackerObjects = fromJson("tracker/tracker_data_for_deletion.json"); + TrackerImportParams params = fromJson("tracker/tracker_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); assertDeletedObjects(1, importReport.getPersistenceReport(), TrackerType.ENROLLMENT); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java index c0c7e4575eb4..3f2221e5af24 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java @@ -37,7 +37,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.hisp.dhis.user.User; @@ -60,12 +59,11 @@ protected void initTest() throws IOException { @Test void testStatsCountForOneCreatedTEI() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/single_tei.json"); + params.setUserId(userA.getUid()); + params.setAtomicMode(AtomicMode.OBJECT); - ImportReport trackerImportTeiReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); assertNoErrors(trackerImportTeiReport); assertEquals(1, trackerImportTeiReport.getStats().getCreated()); @@ -76,19 +74,16 @@ void testStatsCountForOneCreatedTEI() throws IOException { @Test void testStatsCountForOneCreatedAndOneUpdatedTEI() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/single_tei.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/one_update_tei_and_one_new_tei.json"); + params = fromJson("tracker/one_update_tei_and_one_new_tei.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportTeiReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); assertNoErrors(trackerImportTeiReport); assertEquals(1, trackerImportTeiReport.getStats().getCreated()); @@ -99,20 +94,17 @@ void testStatsCountForOneCreatedAndOneUpdatedTEI() throws IOException { @Test void testStatsCountForOneCreatedAndOneUpdatedTEIAndOneInvalidTEI() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/single_tei.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/one_update_tei_and_one_new_tei_and_one_invalid_tei.json"); + params = fromJson("tracker/one_update_tei_and_one_new_tei_and_one_invalid_tei.json"); params.setUserId(userA.getUid()); params.setAtomicMode(AtomicMode.OBJECT); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportTeiReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); assertNotNull(trackerImportTeiReport); assertEquals(Status.OK, trackerImportTeiReport.getStatus()); @@ -125,19 +117,16 @@ void testStatsCountForOneCreatedAndOneUpdatedTEIAndOneInvalidTEI() throws IOExce @Test void testStatsCountForOneCreatedEnrollment() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/single_tei.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_enrollment.json"); + params = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); assertNoErrors(trackerImportEnrollmentReport); assertEquals(1, trackerImportEnrollmentReport.getStats().getCreated()); @@ -148,19 +137,16 @@ void testStatsCountForOneCreatedEnrollment() throws IOException { @Test void testStatsCountForOneCreatedEnrollmentAndUpdateSameEnrollment() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/single_tei.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_enrollment.json"); + params = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); assertNoErrors(trackerImportEnrollmentReport); assertEquals(1, trackerImportEnrollmentReport.getStats().getCreated()); @@ -168,11 +154,11 @@ void testStatsCountForOneCreatedEnrollmentAndUpdateSameEnrollment() throws IOExc assertEquals(0, trackerImportEnrollmentReport.getStats().getIgnored()); assertEquals(0, trackerImportEnrollmentReport.getStats().getDeleted()); - trackerObjects = fromJson("tracker/single_enrollment.json"); + params = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - trackerImportEnrollmentReport = trackerImportService.importTracker(params, trackerObjects); + trackerImportEnrollmentReport = trackerImportService.importTracker(params); assertNoErrors(trackerImportEnrollmentReport); assertEquals(0, trackerImportEnrollmentReport.getStats().getCreated()); @@ -183,24 +169,21 @@ void testStatsCountForOneCreatedEnrollmentAndUpdateSameEnrollment() throws IOExc @Test void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollment() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/one_update_tei_and_one_new_tei.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/one_update_tei_and_one_new_tei.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_enrollment.json"); + params = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/one_update_enrollment_and_one_new_enrollment.json"); + params = fromJson("tracker/one_update_enrollment_and_one_new_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); assertNoErrors(trackerImportEnrollmentReport); assertEquals(1, trackerImportEnrollmentReport.getStats().getCreated()); @@ -212,26 +195,23 @@ void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollment() throws IOExce @Test void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollmentAndOneInvalidEnrollment() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/three_teis.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/three_teis.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_enrollment.json"); + params = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/one_update_and_one_new_and_one_invalid_enrollment.json"); + params = fromJson("tracker/one_update_and_one_new_and_one_invalid_enrollment.json"); params.setUserId(userA.getUid()); params.setAtomicMode(AtomicMode.OBJECT); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); assertNotNull(trackerImportEnrollmentReport); assertEquals(Status.OK, trackerImportEnrollmentReport.getStatus()); @@ -244,23 +224,20 @@ void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollmentAndOneInvalidEnr @Test void testStatsCountForOneCreatedEvent() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/single_tei.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_enrollment.json"); + params = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_event.json"); + params = fromJson("tracker/single_event.json"); params.setUserId(userA.getUid()); - ImportReport trackerImportEventReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportEventReport = trackerImportService.importTracker(params); assertNoErrors(trackerImportEventReport); assertEquals(1, trackerImportEventReport.getStats().getCreated()); @@ -271,29 +248,26 @@ void testStatsCountForOneCreatedEvent() throws IOException { @Test void testStatsCountForOneUpdateEventAndOneNewEvent() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/single_tei.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_enrollment.json"); + params = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_event.json"); + params = fromJson("tracker/single_event.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/one_update_event_and_one_new_event.json"); + params = fromJson("tracker/one_update_event_and_one_new_event.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEventReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportEventReport = trackerImportService.importTracker(params); assertNoErrors(trackerImportEventReport); assertEquals(1, trackerImportEventReport.getStats().getCreated()); @@ -304,30 +278,27 @@ void testStatsCountForOneUpdateEventAndOneNewEvent() throws IOException { @Test void testStatsCountForOneUpdateEventAndOneNewEventAndOneInvalidEvent() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); - TrackerImportParams params = - TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); + TrackerImportParams params = fromJson("tracker/single_tei.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_enrollment.json"); + params = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/single_event.json"); + params = fromJson("tracker/single_event.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params, trackerObjects); + trackerImportService.importTracker(params); - trackerObjects = fromJson("tracker/one_update_and_one_new_and_one_invalid_event.json"); + params = fromJson("tracker/one_update_and_one_new_and_one_invalid_event.json"); params.setUserId(userA.getUid()); params.setAtomicMode(AtomicMode.OBJECT); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEventReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportEventReport = trackerImportService.importTracker(params); assertNotNull(trackerImportEventReport); assertEquals(Status.OK, trackerImportEventReport.getStatus()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java index b5c6e904bbf9..b5d2f85398d7 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java @@ -41,10 +41,8 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheatService; import org.hisp.dhis.tracker.imports.report.ImportReport; @@ -72,10 +70,8 @@ protected void initTest() throws IOException { @Test void testTrackedAttributePreheater() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/te_with_tea_data.json"); - TrackerPreheat preheat = - trackerPreheatService.preheat( - trackerObjects, new TrackerIdSchemeParams(), userService.getUser(ADMIN_USER_UID)); + TrackerImportParams trackerImportParams = fromJson("tracker/te_with_tea_data.json"); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerImportParams); assertNotNull(preheat.get(OrganisationUnit.class, "cNEZTkdAvmg")); assertNotNull(preheat.get(TrackedEntityType.class, "KrYIdvLxkMb")); assertNotNull(preheat.get(TrackedEntityAttribute.class, "sYn3tkL3XKa")); @@ -85,9 +81,8 @@ void testTrackedAttributePreheater() throws IOException { @Test void testTrackedAttributeValueBundleImporter() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/te_with_tea_data.json"); - TrackerImportParams params = TrackerImportParams.builder().build(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = + trackerImportService.importTracker(fromJson("tracker/te_with_tea_data.json")); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java index dd59653ea493..bbc7722dc71a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java @@ -46,7 +46,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -72,8 +71,7 @@ protected void initTest() throws IOException { @Test void testTrackedEntityAttributeValueAuditCreate() throws IOException { assertNoErrors( - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/te_program_with_tea_data.json"))); + trackerImportService.importTracker(fromJson("tracker/te_program_with_tea_data.json"))); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(1, trackedEntities.size()); @@ -97,10 +95,9 @@ void testTrackedEntityAttributeValueAuditCreate() throws IOException { @Test void testTrackedEntityAttributeValueAuditDelete() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); + TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); List attributeValues1 = trackedEntityAttributeValueService.getTrackedEntityAttributeValues( @@ -109,9 +106,9 @@ void testTrackedEntityAttributeValueAuditDelete() throws IOException { attributeValues1.stream() .map(TrackedEntityAttributeValue::getAttribute) .collect(Collectors.toList()); - trackerObjects = fromJson("tracker/te_program_with_tea_null_data.json"); - params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(params, trackerObjects); + trackerImportParams = fromJson("tracker/te_program_with_tea_null_data.json"); + trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); List attributeValueAudits = diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java index a90f2ee01e9a..fd8935c6ea60 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java @@ -43,7 +43,6 @@ import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueAudit; import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueAuditService; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -78,16 +77,15 @@ protected void initTest() throws IOException { @Test void testTrackedEntityDataValueAuditCreate() throws IOException { - TrackerImportParams params = new TrackerImportParams(); assertNoErrors( trackerImportService.importTracker( - params, fromJson("tracker/event_and_enrollment_with_data_values.json"))); + fromJson("tracker/event_and_enrollment_with_data_values.json"))); assertNoErrors( trackerImportService.importTracker( - params, fromJson("tracker/event_with_data_values_for_update_audit.json"))); + fromJson("tracker/event_with_data_values_for_update_audit.json"))); assertNoErrors( trackerImportService.importTracker( - params, fromJson("tracker/event_with_data_values_for_delete_audit.json"))); + fromJson("tracker/event_with_data_values_for_delete_audit.json"))); dataElement = manager.search(DataElement.class, DE); event = manager.search(Event.class, PSI); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java index 3c3c8dee2e8e..875ff64b62b5 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java @@ -38,7 +38,6 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; @@ -69,7 +68,6 @@ protected void initTest() throws IOException { void testTrackedEntityProgramAttributeEncryptedValue() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/te_program_with_tea_encryption_data.json")); assertNoErrors(importReport); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java index 5338a1ddaee6..825b17d073e2 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java @@ -43,7 +43,6 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; @@ -83,7 +82,6 @@ void testTrackedEntityProgramAttributeFileResourceValue() throws IOException { assertFalse(fileResource.isAssigned()); ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/te_program_with_tea_fileresource_data.json")); assertNoErrors(importReport); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java index 2a0d63d8c3d4..1bd7a6209887 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java @@ -40,7 +40,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -64,9 +63,8 @@ protected void initTest() throws IOException { @Test void testTrackedEntityProgramAttributeValue() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -79,9 +77,8 @@ void testTrackedEntityProgramAttributeValue() throws IOException { @Test void testTrackedEntityProgramAttributeValueUpdate() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -92,9 +89,9 @@ void testTrackedEntityProgramAttributeValueUpdate() throws IOException { assertEquals(5, attributeValues.size()); manager.clear(); // update - trackerObjects = fromJson("tracker/te_program_with_tea_update_data.json"); - params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(params, trackerObjects); + trackerImportParams = fromJson("tracker/te_program_with_tea_update_data.json"); + trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); trackedEntities = manager.getAll(TrackedEntity.class); @@ -107,9 +104,8 @@ void testTrackedEntityProgramAttributeValueUpdate() throws IOException { @Test void testTrackedEntityProgramAttributeValueUpdateAndDelete() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -120,9 +116,9 @@ void testTrackedEntityProgramAttributeValueUpdateAndDelete() throws IOException assertEquals(5, attributeValues.size()); manager.clear(); // update - trackerObjects = fromJson("tracker/te_program_with_tea_update_data.json"); - params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(params, trackerObjects); + trackerImportParams = fromJson("tracker/te_program_with_tea_update_data.json"); + trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); trackedEntities = manager.getAll(TrackedEntity.class); @@ -133,9 +129,9 @@ void testTrackedEntityProgramAttributeValueUpdateAndDelete() throws IOException assertEquals(5, attributeValues.size()); manager.clear(); // delete - trackerObjects = fromJson("tracker/te_program_with_tea_delete_data.json"); - params.setImportStrategy(TrackerImportStrategy.DELETE); - importReport = trackerImportService.importTracker(params, trackerObjects); + trackerImportParams = fromJson("tracker/te_program_with_tea_delete_data.json"); + trackerImportParams.setImportStrategy(TrackerImportStrategy.DELETE); + importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); trackedEntities = manager.getAll(TrackedEntity.class); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java index 85f96e5a0bce..3519956be68b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java @@ -39,7 +39,6 @@ import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -68,11 +67,9 @@ void testVerifyMetadata() { @Test void testTrackedEntityImport() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/trackedentity_basic_data.json"); - assertEquals(13, trackerObjects.getTrackedEntities().size()); - TrackerBundle trackerBundle = - trackerBundleService.create( - new TrackerImportParams(), trackerObjects, userService.getUser(ADMIN_USER_UID)); + TrackerImportParams trackerImportParams = fromJson("tracker/trackedentity_basic_data.json"); + assertEquals(13, trackerImportParams.getTrackedEntities().size()); + TrackerBundle trackerBundle = trackerBundleService.create(trackerImportParams); trackerBundleService.commit(trackerBundle); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(13, trackedEntities.size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java index 36acc0dc557c..b67f6fcc79fd 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java @@ -38,7 +38,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -59,10 +58,9 @@ protected void initTest() throws IOException { @Test void testCreateSingleEventData() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/event_events_and_enrollment.json"); - assertEquals(8, trackerObjects.getEvents().size()); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + TrackerImportParams trackerImportParams = fromJson("tracker/event_events_and_enrollment.json"); + assertEquals(8, trackerImportParams.getEvents().size()); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); List events = eventStore.getAll(); @@ -71,15 +69,13 @@ void testCreateSingleEventData() throws IOException { @Test void testUpdateSingleEventData() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/event_events_and_enrollment.json"); - TrackerImportParams trackerImportParams = new TrackerImportParams(); + TrackerImportParams trackerImportParams = fromJson("tracker/event_events_and_enrollment.json"); trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = - trackerImportService.importTracker(trackerImportParams, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); assertEquals(8, eventStore.getAll().size()); - importReport = trackerImportService.importTracker(trackerImportParams, trackerObjects); + importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); assertEquals(8, eventStore.getAll().size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java index f548deddc7e6..17ecd943bbc5 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java @@ -40,7 +40,6 @@ import org.hisp.dhis.programrule.ProgramRuleService; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -71,11 +70,9 @@ protected void initTest() throws IOException { @Test void testRunRuleEngineForEventOnBundleCreate() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/event_events_and_enrollment.json"); - assertEquals(8, trackerObjects.getEvents().size()); - TrackerBundle trackerBundle = - trackerBundleService.create( - new TrackerImportParams(), trackerObjects, userService.getUser(ADMIN_USER_UID)); + TrackerImportParams trackerImportParams = fromJson("tracker/event_events_and_enrollment.json"); + assertEquals(8, trackerImportParams.getEvents().size()); + TrackerBundle trackerBundle = trackerBundleService.create(trackerImportParams); trackerBundle = trackerBundleService.runRuleEngine(trackerBundle); assertEquals(trackerBundle.getEvents().size(), trackerBundle.getEventRuleEffects().size()); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java index 373b53f17c34..91bf43adb2f4 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java @@ -36,7 +36,6 @@ import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.program.notification.ProgramNotificationInstance; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Disabled; @@ -62,7 +61,6 @@ protected void initTest() throws IOException { void testRuleEngineSideEffectHandlerService() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/enrollment_data_with_program_rule_side_effects.json")); assertNoErrors(importReport); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java index 2d6d3a54558a..c77a08a2de31 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java @@ -30,6 +30,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import static org.hisp.dhis.tracker.imports.TrackerIdSchemeParams.builder; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -53,11 +54,10 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; -import org.hisp.dhis.user.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -69,12 +69,9 @@ class TrackerPreheatIdentifiersTest extends TrackerTest { @Autowired private IdentifiableObjectManager manager; - private User user; - @Override protected void initTest() throws IOException { setUpMetadata("tracker/identifier_metadata.json"); - user = currentUserService.getCurrentUser(); } @Test @@ -84,10 +81,9 @@ void testOrgUnitIdentifiers() { String id = pair.getLeft(); TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().orgUnit(param.toMetadataIdentifier(id)).build(); - TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); - TrackerIdSchemeParams params = TrackerIdSchemeParams.builder().orgUnitIdScheme(param).build(); + TrackerImportParams params = buildParams(event, builder().orgUnitIdScheme(param).build()); - TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); + TrackerPreheat preheat = trackerPreheatService.preheat(params); assertPreheatedObjectExists(preheat, OrganisationUnit.class, param, id); } @@ -100,11 +96,10 @@ void testProgramStageIdentifiers() { String id = pair.getLeft(); TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().programStage(param.toMetadataIdentifier(id)).build(); - TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); - TrackerIdSchemeParams params = - TrackerIdSchemeParams.builder().programStageIdScheme(param).build(); + TrackerImportParams params = + buildParams(event, builder().programStageIdScheme(param).build()); - TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); + TrackerPreheat preheat = trackerPreheatService.preheat(params); assertPreheatedObjectExists(preheat, ProgramStage.class, param, id); } @@ -123,11 +118,9 @@ void testDataElementIdentifiers() { .programStage(MetadataIdentifier.ofUid("NpsdDv6kKSO")) .dataValues(Collections.singleton(dv1)) .build(); - TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); - TrackerIdSchemeParams params = - TrackerIdSchemeParams.builder().dataElementIdScheme(param).build(); + TrackerImportParams params = buildParams(event, builder().dataElementIdScheme(param).build()); - TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); + TrackerPreheat preheat = trackerPreheatService.preheat(params); assertPreheatedObjectExists(preheat, DataElement.class, param, id); } @@ -141,11 +134,10 @@ void testCategoryOptionIdentifiers() { TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().attributeCategoryOptions(Set.of(param.toMetadataIdentifier(id))).build(); - TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); - TrackerIdSchemeParams params = - TrackerIdSchemeParams.builder().categoryOptionIdScheme(param).build(); + TrackerImportParams params = + buildParams(event, builder().categoryOptionIdScheme(param).build()); - TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); + TrackerPreheat preheat = trackerPreheatService.preheat(params); assertPreheatedObjectExists(preheat, CategoryOption.class, param, id); } @@ -158,11 +150,10 @@ void testCategoryOptionComboIdentifiers() { String id = pair.getLeft(); TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().attributeOptionCombo(param.toMetadataIdentifier(id)).build(); - TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); - TrackerIdSchemeParams params = - TrackerIdSchemeParams.builder().categoryOptionComboIdScheme(param).build(); + TrackerImportParams params = + buildParams(event, builder().categoryOptionComboIdScheme(param).build()); - TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); + TrackerPreheat preheat = trackerPreheatService.preheat(params); assertPreheatedObjectExists(preheat, CategoryOptionCombo.class, param, id); } @@ -171,10 +162,10 @@ void testCategoryOptionComboIdentifiers() { @Test void testDefaultsWithIdSchemeUID() { - TrackerObjects trackerObjects = TrackerObjects.builder().build(); - TrackerIdSchemeParams params = TrackerIdSchemeParams.builder().build(); + TrackerImportParams params = + TrackerImportParams.builder().user(currentUserService.getCurrentUser()).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); + TrackerPreheat preheat = trackerPreheatService.preheat(params); assertPreheatHasDefault(preheat, Category.class); assertPreheatHasDefault(preheat, CategoryCombo.class); @@ -184,15 +175,20 @@ void testDefaultsWithIdSchemeUID() { @Test void testDefaultsWithIdSchemesOtherThanUID() { - TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(new Event())).build(); - TrackerIdSchemeParams params = - TrackerIdSchemeParams.builder() - .idScheme(TrackerIdSchemeParam.NAME) - .categoryOptionIdScheme(TrackerIdSchemeParam.ofAttribute(CodeGenerator.generateUid())) - .categoryOptionComboIdScheme(TrackerIdSchemeParam.CODE) - .build(); - TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); + Event event = new Event(); + + TrackerImportParams params = + buildParams( + event, + builder() + .idScheme(TrackerIdSchemeParam.NAME) + .categoryOptionIdScheme( + TrackerIdSchemeParam.ofAttribute(CodeGenerator.generateUid())) + .categoryOptionComboIdScheme(TrackerIdSchemeParam.CODE) + .build()); + + TrackerPreheat preheat = trackerPreheatService.preheat(params); assertPreheatHasDefault(preheat, Category.class); assertPreheatHasDefault(preheat, CategoryCombo.class); @@ -200,6 +196,16 @@ void testDefaultsWithIdSchemesOtherThanUID() { assertPreheatHasDefault(preheat, CategoryOptionCombo.class); } + private TrackerImportParams buildParams(Event event, TrackerIdSchemeParams idParams) { + TrackerImportParams params = + TrackerImportParams.builder() + .events(Collections.singletonList(event)) + .user(currentUserService.getCurrentUser()) + .idSchemes(idParams) + .build(); + return params; + } + private List> buildDataSet( String uid, String code, String name) { List> data = new ArrayList<>(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java index 78ba1fa1b5c6..5f3f45d3f588 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java @@ -45,10 +45,10 @@ import org.hisp.dhis.trackedentity.TrackedEntityTypeService; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; import org.junit.jupiter.api.Test; @@ -120,21 +120,20 @@ void testPreheatWithDifferentIdSchemes() { .trackedEntity("TE123456789") .build(); - TrackerObjects trackerObjects = - TrackerObjects.builder() + TrackerImportParams params = + TrackerImportParams.builder() + .user(currentUser) .trackedEntities(Lists.newArrayList(teA)) .enrollments(Lists.newArrayList(enrollmentA)) + .idSchemes( + TrackerIdSchemeParams.builder() + .idScheme(TrackerIdSchemeParam.UID) + .orgUnitIdScheme(TrackerIdSchemeParam.CODE) + .programIdScheme(TrackerIdSchemeParam.ofAttribute(ATTRIBUTE_UID)) + .build()) .build(); - TrackerIdSchemeParams idSchemeParams = - TrackerIdSchemeParams.builder() - .idScheme(TrackerIdSchemeParam.UID) - .orgUnitIdScheme(TrackerIdSchemeParam.CODE) - .programIdScheme(TrackerIdSchemeParam.ofAttribute(ATTRIBUTE_UID)) - .build(); - - TrackerPreheat preheat = - trackerPreheatService.preheat(trackerObjects, idSchemeParams, currentUser); + TrackerPreheat preheat = trackerPreheatService.preheat(params); assertNotNull(preheat); // asserting on specific fields instead of plain assertEquals since diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java index b17a4517f57b..4cfaa53f987a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java @@ -42,11 +42,12 @@ import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerIdentifierCollector; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -64,11 +65,11 @@ protected void initTest() {} @Test void testCollectIdentifiersEvents() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/event_events.json"); - assertTrue(trackerObjects.getTrackedEntities().isEmpty()); - assertTrue(trackerObjects.getEnrollments().isEmpty()); - assertFalse(trackerObjects.getEvents().isEmpty()); - Map, Set> collectedMap = identifierCollector.collect(trackerObjects); + TrackerImportParams params = fromJson("tracker/event_events.json"); + assertTrue(params.getTrackedEntities().isEmpty()); + assertTrue(params.getEnrollments().isEmpty()); + assertFalse(params.getEvents().isEmpty()); + Map, Set> collectedMap = identifierCollector.collect(params); assertTrue(collectedMap.containsKey(DataElement.class)); assertTrue(collectedMap.containsKey(ProgramStage.class)); assertTrue(collectedMap.containsKey(OrganisationUnit.class)); @@ -102,8 +103,12 @@ void testCollectIdentifiersEvents() throws IOException { @Test void testCollectIdentifiersAttributeValues() { - TrackerObjects trackerObjects = - TrackerObjects.builder() + TrackerImportParams params = + TrackerImportParams.builder() + .idSchemes( + TrackerIdSchemeParams.builder() + .idScheme(TrackerIdSchemeParam.ofAttribute("ATTR1234567")) + .build()) .trackedEntities( Lists.newArrayList( TrackedEntity.builder() @@ -111,10 +116,10 @@ void testCollectIdentifiersAttributeValues() { .orgUnit(MetadataIdentifier.ofCode("OU123456789")) .build())) .build(); - assertFalse(trackerObjects.getTrackedEntities().isEmpty()); - assertTrue(trackerObjects.getEnrollments().isEmpty()); - assertTrue(trackerObjects.getEvents().isEmpty()); - Map, Set> collectedMap = identifierCollector.collect(trackerObjects); + assertFalse(params.getTrackedEntities().isEmpty()); + assertTrue(params.getEnrollments().isEmpty()); + assertTrue(params.getEvents().isEmpty()); + Map, Set> collectedMap = identifierCollector.collect(params); assertTrue(collectedMap.containsKey(TrackedEntity.class)); Set trackedEntities = collectedMap.get(TrackedEntity.class); assertTrue(collectedMap.containsKey(OrganisationUnit.class)); @@ -127,20 +132,21 @@ void testCollectIdentifiersAttributeValues() { @Test void testPreheatValidation() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/event_events.json"); - assertTrue(trackerObjects.getTrackedEntities().isEmpty()); - assertTrue(trackerObjects.getEnrollments().isEmpty()); - assertFalse(trackerObjects.getEvents().isEmpty()); + TrackerImportParams params = fromJson("tracker/event_events.json"); + assertTrue(params.getTrackedEntities().isEmpty()); + assertTrue(params.getEnrollments().isEmpty()); + assertFalse(params.getEvents().isEmpty()); } @Test void testPreheatEvents() throws IOException { setUpMetadata("tracker/event_metadata.json"); - TrackerObjects trackerObjects = fromJson("tracker/event_events.json"); + TrackerImportParams params = fromJson("tracker/event_events.json"); + assertTrue(params.getTrackedEntities().isEmpty()); + assertTrue(params.getEnrollments().isEmpty()); + assertFalse(params.getEvents().isEmpty()); - TrackerPreheat preheat = - trackerPreheatService.preheat( - trackerObjects, new TrackerIdSchemeParams(), userService.getUser(ADMIN_USER_UID)); + TrackerPreheat preheat = trackerPreheatService.preheat(params); assertNotNull(preheat); assertFalse(preheat.getAll(DataElement.class).isEmpty()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java index 3d27f7cd4b68..e33d41b7760a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java @@ -52,7 +52,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -87,31 +86,28 @@ public void initTest() throws IOException { assignProgramRule(); trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_completed_event.json")); } @Test void shouldImportWithWarningWhenDataElementWithSameValueIsAssignedByAssignRule() throws IOException { - TrackerImportParams params = new TrackerImportParams(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/programrule/event_update_datavalue_same_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyWarnings(importReport, E1308); } @Test void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() throws IOException { - TrackerImportParams params = new TrackerImportParams(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/programrule/event_update_datavalue_different_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, E1307); } @@ -121,12 +117,11 @@ void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() th shouldImportWithWarningWhenDataElementWithDifferentValueIsAssignedByAssignRuleAndOverwriteKeyIsTrue() throws IOException { systemSettingManager.saveSystemSetting(SettingKey.RULE_ENGINE_ASSIGN_OVERWRITE, true); - TrackerImportParams params = new TrackerImportParams(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/programrule/event_update_datavalue_different_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyWarnings(importReport, E1308); } @@ -136,12 +131,11 @@ void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() th shouldImportWithWarningWhenDataElementWithDifferentAndEmptyValueIsAssignedByAssignRuleAndOverwriteKeyIsTrue() throws IOException { systemSettingManager.saveSystemSetting(SettingKey.RULE_ENGINE_ASSIGN_OVERWRITE, true); - TrackerImportParams params = new TrackerImportParams(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/programrule/event_update_datavalue_empty_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyWarnings(importReport, E1308); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java index 44e00dbd3e3a..484ca72cfc65 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java @@ -55,7 +55,6 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.validation.ValidationCode; import org.junit.jupiter.api.Test; @@ -112,8 +111,7 @@ public void initTest() throws IOException { @Test void shouldImportEnrollmentWithNoWarningsWhenThereAreNoProgramRules() throws IOException { ImportReport report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); assertNoErrorsAndNoWarnings(report); } @@ -122,8 +120,7 @@ void shouldImportEnrollmentWithNoWarningsWhenThereAreNoProgramRules() throws IOE void shouldImportEnrollmentWithWarningsWhenAWarningIsTriggered() throws IOException { alwaysTrueWarningProgramRule(); ImportReport report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); assertHasOnlyWarnings(report, E1300); } @@ -132,8 +129,7 @@ void shouldImportEnrollmentWithWarningsWhenAWarningIsTriggered() throws IOExcept void shouldNotImportEnrollmentWhenAnErrorIsTriggered() throws IOException { alwaysTrueErrorProgramRule(); ImportReport report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); assertHasOnlyErrors(report, E1300); } @@ -142,8 +138,7 @@ void shouldNotImportEnrollmentWhenAnErrorIsTriggered() throws IOException { void shouldImportProgramEventWithWarningsWhenAWarningIsTriggered() throws IOException { alwaysTrueWarningProgramEventProgramRule(); ImportReport report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/program_event.json")); + trackerImportService.importTracker(fromJson("tracker/programrule/program_event.json")); assertHasOnlyWarnings(report, E1300); } @@ -153,8 +148,7 @@ void shouldNotImportProgramEventWhenAnErrorIsTriggeredBasedOnConditionEvaluating throws IOException { conditionWithConstantEvaluatesToTrue(); ImportReport report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/program_event.json")); + trackerImportService.importTracker(fromJson("tracker/programrule/program_event.json")); assertHasOnlyErrors(report, E1300); } @@ -163,8 +157,7 @@ void shouldNotImportProgramEventWhenAnErrorIsTriggeredBasedOnConditionEvaluating void shouldNotImportProgramEventWhenAnErrorIsTriggered() throws IOException { alwaysTrueErrorProgramEventProgramRule(); ImportReport report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/program_event.json")); + trackerImportService.importTracker(fromJson("tracker/programrule/program_event.json")); assertHasOnlyErrors(report, E1300); } @@ -173,7 +166,6 @@ void shouldNotImportProgramEventWhenAnErrorIsTriggered() throws IOException { void shouldImportEventWithNoWarningsWhenThereAreNoProgramRules() throws IOException { ImportReport report = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_completed_event.json")); assertNoErrorsAndNoWarnings(report); @@ -182,14 +174,11 @@ void shouldImportEventWithNoWarningsWhenThereAreNoProgramRules() throws IOExcept @Test void shouldImportEventWithWarningsWhenAWarningIsTriggered() throws IOException { ImportReport report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); assertNoErrors(report); alwaysTrueWarningProgramRule(); - report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/event.json")); + report = trackerImportService.importTracker(fromJson("tracker/programrule/event.json")); assertHasOnlyWarnings(report, E1300); } @@ -197,14 +186,11 @@ void shouldImportEventWithWarningsWhenAWarningIsTriggered() throws IOException { @Test void shouldNotImportEventWhenAnErrorIsTriggered() throws IOException { ImportReport report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); assertNoErrors(report); alwaysTrueErrorProgramRule(); - report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/event.json")); + report = trackerImportService.importTracker(fromJson("tracker/programrule/event.json")); assertHasOnlyErrors(report, E1300); } @@ -215,7 +201,6 @@ void shouldNotValidateEventAndValidateEnrollmentWhenAnErrorIsTriggeredOnEvent() onCompleteErrorProgramRule(); ImportReport report = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_completed_event.json")); assertHasOnlyErrors(report, E1300); @@ -226,7 +211,6 @@ void shouldNotImportEventAndEnrollmentWhenAnErrorIsTriggeredOnEnrollment() throw onCompleteErrorProgramRule(); ImportReport report = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_completed_enrollment_event.json")); assertAll( @@ -238,14 +222,11 @@ void shouldNotImportEventAndEnrollmentWhenAnErrorIsTriggeredOnEnrollment() throw void shouldImportEventWhenAnErrorIsTriggeredOnEnrollmentAlreadyPresentInDB() throws IOException { ImportReport report = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_completed_enrollment.json")); assertNoErrorsAndNoWarnings(report); onCompleteErrorProgramRule(); - report = - trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/event.json")); + report = trackerImportService.importTracker(fromJson("tracker/programrule/event.json")); assertNoErrorsAndNoWarnings(report); } @@ -256,7 +237,6 @@ void shouldNotImportWhenErrorIsTriggeredOnAllEntities() throws IOException { alwaysTrueErrorProgramEventProgramRule(); ImportReport report = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_event_programevent.json")); assertAll( @@ -268,10 +248,9 @@ void shouldNotImportWhenErrorIsTriggeredOnAllEntities() throws IOException { @Test void shouldImportWithWarningWhenARuleWithASyntaxErrorIsTriggered() throws IOException { syntaxErrorRule(); - TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment.json"); + TrackerImportParams params = fromJson("tracker/programrule/tei_enrollment.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyWarnings(importReport, E1300); } @@ -280,11 +259,10 @@ void shouldImportWithWarningWhenARuleWithASyntaxErrorIsTriggered() throws IOExce void shouldImportWithWarningWhenAWarningIsTriggeredOnEventInSameProgramStage() throws IOException { programStageWarningRule(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/programrule/tei_enrollment_completed_event.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyWarnings(importReport, E1300); } @@ -293,12 +271,11 @@ void shouldImportWithWarningWhenAWarningIsTriggeredOnEventInSameProgramStage() void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnEventInDifferentProgramStage() throws IOException { programStageWarningRule(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson( "tracker/programrule/tei_enrollment_completed_event_from_another_program_stage.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrorsAndNoWarnings(importReport); } @@ -307,11 +284,10 @@ void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnEventInDifferentProgramS void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnActiveEventInOnCompleteProgramStage() throws IOException { programStage2WarningRule(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/programrule/tei_enrollment_event_from_another_program_stage.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrorsAndNoWarnings(importReport); } @@ -320,12 +296,11 @@ void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnActiveEventInOnCompleteP void shouldImportWithWarningsWhenAWarningIsTriggeredOnCompletedEventInOnCompleteProgramStage() throws IOException { programStage2WarningRule(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson( "tracker/programrule/tei_enrollment_completed_event_from_another_program_stage.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyWarnings(importReport, E1300); } @@ -334,12 +309,11 @@ void shouldImportWithWarningsWhenAWarningIsTriggeredOnCompletedEventInOnComplete void shouldImportWithNoWarningsWhenAWarningIsTriggeredWithADataElementFromADifferentProgramStage() throws IOException { programStage2WrongDataElementWarningRule(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson( "tracker/programrule/tei_enrollment_completed_event_from_another_program_stage.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrorsAndNoWarnings(importReport); } @@ -347,11 +321,10 @@ void shouldImportWithNoWarningsWhenAWarningIsTriggeredWithADataElementFromADiffe @Test void shouldNotImportWithWhenDataElementHasValue() throws IOException { showErrorWhenVariableHasValueRule(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/programrule/tei_completed_enrollment_event.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, E1300); } @@ -359,11 +332,10 @@ void shouldNotImportWithWhenDataElementHasValue() throws IOException { @Test void shouldImportWithNoWarningsWhenDataElementHasNoValue() throws IOException { showErrorWhenVariableHasValueRule(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/programrule/tei_enrollment_event_with_no_data_value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrorsAndNoWarnings(importReport); } @@ -371,11 +343,10 @@ void shouldImportWithNoWarningsWhenDataElementHasNoValue() throws IOException { @Test void shouldImportWithNoWarningsWhenDataElementHasNullValue() throws IOException { showErrorWhenVariableHasValueRule(); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/programrule/tei_enrollment_event_with_null_data_value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrorsAndNoWarnings(importReport); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java index 56fa2c88b94b..c724d547332e 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java @@ -36,7 +36,6 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -55,130 +54,119 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data_2.json"))); manager.flush(); } @Test void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_with_invalid_option_value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1125); } @Test void successValidationWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_with_valid_option_value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } @Test void testAttributesMissingUid() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-missing-uuid.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1075); } @Test void testAttributesMissingValues() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-missing-value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1076); } @Test void testAttributesMissingTeA() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-non-existing.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1006); } @Test void testAttributesMissingMandatory() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-missing-mandatory.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1018); } @Test void testAttributesUniquenessInSameTei() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_unique_attr_same_tei.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } @Test void testAttributesUniquenessAlreadyInDB() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_te-data_3.json"); + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_te-data_3.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); manager.flush(); manager.clear(); - trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr_same_tei.json"); + params = fromJson("tracker/validations/enrollments_te_unique_attr_same_tei.json"); - importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); manager.flush(); manager.clear(); - trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr_in_db.json"); + params = fromJson("tracker/validations/enrollments_te_unique_attr_in_db.json"); - importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1064); } @Test void testAttributesUniquenessInDifferentTeis() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_te-data_3.json"); - assertNoErrors(trackerImportService.importTracker(new TrackerImportParams(), trackerObjects)); + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_te-data_3.json"); + assertNoErrors(trackerImportService.importTracker(params)); manager.flush(); manager.clear(); - trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr.json"); + params = fromJson("tracker/validations/enrollments_te_unique_attr.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasErrors(importReport, 2, ValidationCode.E1064); } @Test void testAttributesOnlyProgramAttrAllowed() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-only-program-attr.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1019); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java index 9feb1f5ff0ad..e66a95192ca9 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java @@ -40,11 +40,9 @@ import org.hisp.dhis.program.EnrollmentService; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.TrackerType; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheatService; import org.hisp.dhis.tracker.imports.report.ImportReport; @@ -70,33 +68,28 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); manager.flush(); } @Test void testEnrollmentValidationOkAll() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } @Test void testPreheatOwnershipForSubsequentEnrollment() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); - TrackerObjects secondTrackerObjects = + TrackerImportParams secondParams = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - TrackerPreheat preheat = - trackerPreheatService.preheat( - secondTrackerObjects, new TrackerIdSchemeParams(), userService.getUser(ADMIN_USER_UID)); - secondTrackerObjects + TrackerPreheat preheat = trackerPreheatService.preheat(secondParams); + secondParams .getEnrollments() .forEach( e -> { @@ -120,34 +113,31 @@ void testDisplayIncidentDateTrueButDateValueIsInvalid() { @Test void testNoWriteAccessToOrg() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); User user = userService.getUser(USER_2); - TrackerImportParams params = new TrackerImportParams(); - params.setUserId(user.getUid()); + params.setUser(user); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasErrors(importReport, 4, ValidationCode.E1000); } @Test void testOnlyProgramAttributesAllowedOnEnrollments() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_error_non_program_attr.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasErrors(importReport, 3, ValidationCode.E1019); } @Test void testAttributesOk() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-data.json"); + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-data.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); assertEquals( @@ -163,49 +153,45 @@ void testAttributesOk() throws IOException { @Test void testDeleteCascadeEnrollments() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-data.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-data.json"); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); manager.flush(); importEvents(); manager.flush(); - trackerObjects = fromJson("tracker/validations/enrollments_te_attr-data.json"); + params = fromJson("tracker/validations/enrollments_te_attr-data.json"); User user2 = userService.getUser(USER_4); - params.setUserId(user2.getUid()); + params.setUser(user2); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport trackerImportDeleteReport = - trackerImportService.importTracker(params, trackerObjects); + ImportReport trackerImportDeleteReport = trackerImportService.importTracker(params); assertHasOnlyErrors(trackerImportDeleteReport, ValidationCode.E1103, ValidationCode.E1091); } protected void importEvents() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-registration.json"); - TrackerImportParams params = new TrackerImportParams(); + TrackerImportParams params = fromJson("tracker/validations/events-with-registration.json"); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } @Test void testActiveEnrollmentAlreadyExists() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/enrollments_double-tei-enrollment_part1.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); - TrackerObjects trackerObjects2 = + TrackerImportParams trackerImportParams1 = fromJson("tracker/validations/enrollments_double-tei-enrollment_part2.json"); - importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects2); + importReport = trackerImportService.importTracker(trackerImportParams1); ValidationReport validationResult = importReport.getValidationReport(); @@ -214,21 +200,19 @@ void testActiveEnrollmentAlreadyExists() throws IOException { @Test void testEnrollmentDeleteOk() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams paramsCreate = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(paramsCreate); assertNoErrors(importReport); manager.flush(); manager.clear(); - TrackerObjects deleteTrackerObjects = + TrackerImportParams paramsDelete = fromJson("tracker/validations/enrollments_te_enrollments-data-delete.json"); - params.setImportStrategy(TrackerImportStrategy.DELETE); + paramsDelete.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReportDelete = - trackerImportService.importTracker(params, deleteTrackerObjects); + ImportReport importReportDelete = trackerImportService.importTracker(paramsDelete); assertNoErrors(importReportDelete); assertEquals(1, importReportDelete.getStats().getDeleted()); @@ -237,11 +221,9 @@ void testEnrollmentDeleteOk() throws IOException { /** Notes with no value are ignored */ @Test void testBadEnrollmentNoteNoValue() throws IOException { - TrackerObjects trackerObjects = - fromJson("tracker/validations/enrollments_bad-note-no-value.json"); + TrackerImportParams params = fromJson("tracker/validations/enrollments_bad-note-no-value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java index 3e5218410c38..650514afb414 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java @@ -53,7 +53,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -164,21 +163,19 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); } @Test void testNoWriteAccessToOrg() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); User user = userService.getUser(USER_2); injectSecurityContext(user); - TrackerImportParams params = new TrackerImportParams(); - params.setUserId(user.getUid()); + params.setUser(user); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasErrors(importReport, 4, ValidationCode.E1000); } @@ -196,12 +193,11 @@ void testUserNoAccessToTrackedEntity() throws IOException { createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); userService.addUser(user); injectSecurityContext(user); - TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_no-access-tei.json"); - TrackerImportParams params = new TrackerImportParams(); - params.setUserId(user.getUid()); + TrackerImportParams params = fromJson("tracker/validations/enrollments_no-access-tei.json"); + params.setUser(user); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1104); } @@ -223,13 +219,11 @@ void testUserNoWriteAccessToProgram() throws IOException { createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); userService.addUser(user); injectSecurityContext(user); - TrackerObjects trackerObjects = - fromJson("tracker/validations/enrollments_no-access-program.json"); - TrackerImportParams params = new TrackerImportParams(); - params.setUserId(user.getUid()); + TrackerImportParams params = fromJson("tracker/validations/enrollments_no-access-program.json"); + params.setUser(user); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1091); } @@ -247,13 +241,11 @@ void testUserHasWriteAccessToProgram() throws IOException { createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); userService.addUser(user); injectSecurityContext(user); - TrackerObjects trackerObjects = - fromJson("tracker/validations/enrollments_no-access-program.json"); - TrackerImportParams params = new TrackerImportParams(); - params.setUserId(user.getUid()); + TrackerImportParams params = fromJson("tracker/validations/enrollments_no-access-program.json"); + params.setUser(user); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } @@ -270,13 +262,12 @@ void testUserHasNoAccessToProgramTeiType() throws IOException { User user = createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); injectSecurityContext(user); - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_program-teitype-missmatch.json"); - TrackerImportParams params = new TrackerImportParams(); - params.setUserId(user.getUid()); + params.setUser(user); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1104); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java index 97701106ae92..6faf730c1010 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java @@ -59,7 +59,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.TrackerTypeReport; import org.hisp.dhis.user.User; @@ -86,11 +85,9 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); assertNoErrors( trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_enrollments-data.json"))); } @@ -98,7 +95,6 @@ protected void initTest() throws IOException { void testInvalidEnrollmentPreventsValidEventFromBeingCreated() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/invalid_enrollment_with_valid_event.json")); assertHasOnlyErrors(importReport, ValidationCode.E1070, ValidationCode.E5000); @@ -108,7 +104,6 @@ void testInvalidEnrollmentPreventsValidEventFromBeingCreated() throws IOExceptio void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events-with_invalid_option_value.json")); assertHasOnlyErrors(importReport, ValidationCode.E1125); @@ -118,7 +113,6 @@ void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOExce void successWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events-with_valid_option_value.json")); assertNoErrors(importReport); @@ -128,7 +122,6 @@ void successWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { void testEventValidationOkAll() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events-with-registration.json")); assertNoErrors(importReport); @@ -138,7 +131,6 @@ void testEventValidationOkAll() throws IOException { void testEventValidationOkWithoutAttributeOptionCombo() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events-without-attribute-option-combo.json")); assertNoErrors(importReport); @@ -146,24 +138,24 @@ void testEventValidationOkWithoutAttributeOptionCombo() throws IOException { @Test void testTrackerAndProgramEventUpdateSuccess() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/program_and_tracker_events.json"); - TrackerImportParams params = new TrackerImportParams(); - assertNoErrors(trackerImportService.importTracker(params, trackerObjects)); + TrackerImportParams trackerBundleParams = + fromJson("tracker/validations/program_and_tracker_events.json"); + assertNoErrors(trackerImportService.importTracker(trackerBundleParams)); - params.setImportStrategy(UPDATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + trackerBundleParams.setImportStrategy(UPDATE); + ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); assertNoErrors(importReport); } @Test void testCantWriteAccessCatCombo() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/events-cat-write-access.json"); - TrackerImportParams params = new TrackerImportParams(); + TrackerImportParams trackerImportParams = + fromJson("tracker/validations/events-cat-write-access.json"); User user = userService.getUser(USER_6); - params.setUserId(user.getUid()); + trackerImportParams.setUser(user); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertHasOnlyErrors( importReport, @@ -175,45 +167,44 @@ void testCantWriteAccessCatCombo() throws IOException { @Test void testNoWriteAccessToOrg() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-registration.json"); - TrackerImportParams params = new TrackerImportParams(); + TrackerImportParams trackerBundleParams = + fromJson("tracker/validations/events-with-registration.json"); User user = userService.getUser(USER_2); - params.setUserId(user.getUid()); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + trackerBundleParams.setUser(user); + ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); assertHasOnlyErrors(importReport, ValidationCode.E1000); } @Test void testNonRepeatableProgramStage() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/events_non-repeatable-programstage_part1.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); - trackerObjects = fromJson("tracker/validations/events_non-repeatable-programstage_part2.json"); + trackerImportParams = + fromJson("tracker/validations/events_non-repeatable-programstage_part2.json"); - importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + importReport = trackerImportService.importTracker(trackerImportParams); assertHasOnlyErrors(importReport, ValidationCode.E1039); } @Test void shouldSuccessfullyImportRepeatedEventsInEventProgram() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/program_events_non-repeatable-programstage_part1.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); - trackerObjects = + trackerImportParams = fromJson("tracker/validations/program_events_non-repeatable-programstage_part2.json"); - importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); } @@ -228,7 +219,6 @@ void testWrongScheduledDateString() { void testEventProgramHasNonDefaultCategoryCombo() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events_non-default-combo.json")); assertHasOnlyErrors(importReport, ValidationCode.E1055); @@ -238,7 +228,6 @@ void testEventProgramHasNonDefaultCategoryCombo() throws IOException { void testCategoryOptionComboNotFound() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-cat-opt-combo.json")); assertHasOnlyErrors(importReport, ValidationCode.E1115); @@ -248,7 +237,6 @@ void testCategoryOptionComboNotFound() throws IOException { void testCategoryOptionComboNotFoundGivenSubsetOfCategoryOptions() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-aoc-with-subset-of-cos.json")); assertHasOnlyErrors(importReport, ValidationCode.E1117); @@ -258,7 +246,6 @@ void testCategoryOptionComboNotFoundGivenSubsetOfCategoryOptions() throws IOExce void testCOFoundButAOCNotFound() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-aoc-but-co-exists.json")); assertHasOnlyErrors(importReport, ValidationCode.E1115); @@ -268,7 +255,6 @@ void testCOFoundButAOCNotFound() throws IOException { void testCategoryOptionsNotFound() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-cat-option.json")); assertHasOnlyErrors(importReport, ValidationCode.E1116); @@ -278,7 +264,6 @@ void testCategoryOptionsNotFound() throws IOException { void testAttributeCategoryOptionNotInProgramCC() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events-aoc-not-in-program-cc.json")); assertHasOnlyErrors(importReport, ValidationCode.E1054); @@ -288,7 +273,6 @@ void testAttributeCategoryOptionNotInProgramCC() throws IOException { void testAttributeCategoryOptionAndCODoNotMatch() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events-aoc-and-co-dont-match.json")); assertHasOnlyErrors(importReport, ValidationCode.E1117); @@ -299,7 +283,6 @@ void testAttributeCategoryOptionCannotBeFoundForEventProgramCCAndGivenCategoryOp throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson( "tracker/validations/events_cant-find-cat-option-combo-for-given-cc-and-co.json")); @@ -310,7 +293,6 @@ void testAttributeCategoryOptionCannotBeFoundForEventProgramCCAndGivenCategoryOp void testWrongDatesInCatCombo() throws IOException { ImportReport importReport = trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/events_combo-date-wrong.json")); assertHasOnlyErrors(importReport, ValidationCode.E1056, ValidationCode.E1057); @@ -380,43 +362,41 @@ private void testDeletedEventFails(TrackerImportStrategy importStrategy) { assertNotNull(event); // When -> Soft-delete the event programStageServiceInstance.deleteEvent(event); - TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-notes-data.json"); - TrackerImportParams params = new TrackerImportParams(); - params.setImportStrategy(importStrategy); + TrackerImportParams trackerBundleParams = + fromJson("tracker/validations/events-with-notes-data.json"); + trackerBundleParams.setImportStrategy(importStrategy); // When - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); assertHasOnlyErrors(importReport, ValidationCode.E1082); } @Test void testEventDeleteOk() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-registration.json"); - TrackerImportParams params = new TrackerImportParams(); + TrackerImportParams trackerBundleParams = + fromJson("tracker/validations/events-with-registration.json"); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); assertNoErrors(importReport); manager.flush(); manager.clear(); - TrackerObjects deleteTrackerObjects = fromJson("tracker/validations/event-data-delete.json"); - params.setImportStrategy(DELETE); + TrackerImportParams paramsDelete = fromJson("tracker/validations/event-data-delete.json"); + paramsDelete.setImportStrategy(DELETE); - ImportReport importReportDelete = - trackerImportService.importTracker(params, deleteTrackerObjects); + ImportReport importReportDelete = trackerImportService.importTracker(paramsDelete); assertNoErrors(importReportDelete); assertEquals(1, importReportDelete.getStats().getDeleted()); } private ImportReport createEvent(String jsonPayload) throws IOException { // Given - TrackerObjects trackerObjects = fromJson(jsonPayload); - TrackerImportParams params = new TrackerImportParams(); - params.setImportStrategy(CREATE_AND_UPDATE); + TrackerImportParams trackerBundleParams = fromJson(jsonPayload); + trackerBundleParams.setImportStrategy(CREATE_AND_UPDATE); // When - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); // Then assertNoErrors(importReport); return importReport; diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java index 250bf1a50eb4..f870d492eb17 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java @@ -63,7 +63,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -128,11 +127,9 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); assertNoErrors( trackerImportService.importTracker( - new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_enrollments-data.json"))); manager.flush(); } @@ -220,14 +217,14 @@ private void setupMetadata() { @Test void testNoWriteAccessToProgramStage() throws IOException { setupMetadata(); - TrackerObjects trackerObjects = + TrackerImportParams trackerBundleParams = fromJson("tracker/validations/events_error-no-programStage-access.json"); - TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_3); - params.setUserId(user.getUid()); + trackerBundleParams.setUser(user); user.addOrganisationUnit(organisationUnitA); manager.update(user); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + trackerBundleParams.setUser(user); + ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); assertHasOnlyErrors(importReport, ValidationCode.E1095, ValidationCode.E1096); } @@ -235,15 +232,16 @@ void testNoWriteAccessToProgramStage() throws IOException { @Test void testNoUncompleteEventAuth() throws IOException { setupMetadata(); - TrackerObjects trackerObjects = fromJson("tracker/validations/events_error-no-uncomplete.json"); - TrackerImportParams params = new TrackerImportParams(); + TrackerImportParams params = fromJson("tracker/validations/events_error-no-uncomplete.json"); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); // Change just inserted Event to status COMPLETED... Event zwwuwNp6gVd = programStageServiceInstance.getEvent("ZwwuwNp6gVd"); zwwuwNp6gVd.setStatus(EventStatus.COMPLETED); manager.update(zwwuwNp6gVd); + TrackerImportParams trackerBundleParams = + fromJson("tracker/validations/events_error-no-uncomplete.json"); programA.setPublicAccess(AccessStringHelper.FULL); manager.update(programA); programStageA.setPublicAccess(AccessStringHelper.FULL); @@ -255,9 +253,9 @@ void testNoUncompleteEventAuth() throws IOException { manager.update(user); manager.flush(); manager.clear(); - params.setUserId(user.getUid()); - params.setImportStrategy(TrackerImportStrategy.UPDATE); - importReport = trackerImportService.importTracker(params, trackerObjects); + trackerBundleParams.setUserId(user.getUid()); + trackerBundleParams.setImportStrategy(TrackerImportStrategy.UPDATE); + importReport = trackerImportService.importTracker(trackerBundleParams); assertHasOnlyErrors(importReport, ValidationCode.E1083); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java index dcf6a55beaba..f8bc741c6541 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java @@ -35,7 +35,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -51,33 +50,32 @@ protected void initTest() throws IOException { @Test void testUniqueFailInOrgUnit() throws IOException { - TrackerImportParams params = new TrackerImportParams(); - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/te-program_with_tea_unique_data_in_country.json"); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); - trackerObjects = + trackerImportParams = fromJson("tracker/validations/te-program_with_tea_unique_data_in_country.json"); - params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(params, trackerObjects); + trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); - trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data_in_region.json"); - importReport = trackerImportService.importTracker(params, trackerObjects); + trackerImportParams = + fromJson("tracker/validations/te-program_with_tea_unique_data_in_region.json"); + importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); } @Test void testUniqueFail() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/te-program_with_tea_unique_data.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertNoErrors(importReport); - trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data2.json"); + trackerImportParams = fromJson("tracker/validations/te-program_with_tea_unique_data2.json"); - importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + importReport = trackerImportService.importTracker(trackerImportParams); assertHasOnlyErrors(importReport, ValidationCode.E1064); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java index f13c725ba1a7..ca60d780448d 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java @@ -45,7 +45,6 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -81,9 +80,9 @@ void testTrackedEntityProgramAttributeFileResourceValue() throws IOException { File file = File.createTempFile("file-resource", "test"); fileResourceService.saveFileResource(fileResource, file); assertFalse(fileResource.isAssigned()); - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/te-program_with_tea_fileresource_data.json"); - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + trackerImportService.importTracker(trackerImportParams); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(1, trackedEntities.size()); TrackedEntity trackedEntity = trackedEntities.get(0); @@ -107,9 +106,9 @@ void testFileAlreadyAssign() throws IOException { File file = File.createTempFile("file-resource", "test"); fileResourceService.saveFileResource(fileResource, file); assertFalse(fileResource.isAssigned()); - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/te-program_with_tea_fileresource_data.json"); - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + trackerImportService.importTracker(trackerImportParams); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(1, trackedEntities.size()); TrackedEntity trackedEntity = trackedEntities.get(0); @@ -118,18 +117,17 @@ void testFileAlreadyAssign() throws IOException { assertEquals(1, attributeValues.size()); fileResource = fileResourceService.getFileResource(fileResource.getUid()); assertTrue(fileResource.isAssigned()); - trackerObjects = fromJson("tracker/validations/te-program_with_tea_fileresource_data2.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + trackerImportParams = + fromJson("tracker/validations/te-program_with_tea_fileresource_data2.json"); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertHasOnlyErrors(importReport, ValidationCode.E1009); } @Test void testNoFileRef() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/te-program_with_tea_fileresource_data.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertHasOnlyErrors(importReport, ValidationCode.E1084); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -138,44 +136,40 @@ void testNoFileRef() throws IOException { @Test void testTeaMaxTextValueLength() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/te-program_with_tea_too_long_text_value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertHasOnlyErrors(importReport, ValidationCode.E1077); } @Test void testTeaInvalidFormat() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/te-program_with_tea_invalid_format_value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertHasOnlyErrors(importReport, ValidationCode.E1085); } @Test void testTeaInvalidImage() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/te-program_with_tea_invalid_image_value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertHasOnlyErrors(importReport, ValidationCode.E1085, ValidationCode.E1007); } @Test void testTeaIsNull() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams trackerImportParams = fromJson("tracker/validations/te-program_with_tea_invalid_value_isnull.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(trackerImportParams); assertHasOnlyErrors(importReport, ValidationCode.E1076); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java index d5f62d263553..a32b48287d1c 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java @@ -45,7 +45,6 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.junit.jupiter.api.Test; @@ -67,53 +66,47 @@ protected void initTest() throws IOException { @Test void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOException { - TrackerObjects trackerObjects = - fromJson("tracker/validations/te-with_invalid_option_value.json"); + TrackerImportParams params = fromJson("tracker/validations/te-with_invalid_option_value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1125); } @Test void successValidationWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-with_valid_option_value.json"); + TrackerImportParams params = fromJson("tracker/validations/te-with_valid_option_value.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } @Test void failValidationWhenTrackedEntityAttributesHaveSameUniqueValues() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-with_unique_attributes.json"); + TrackerImportParams params = fromJson("tracker/validations/te-with_unique_attributes.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasErrors(importReport, 2, ValidationCode.E1064); } @Test void testTeValidationOkAll() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } @Test void testNoCreateTeiAccessOutsideCaptureScopeOu() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); - TrackerImportParams params = new TrackerImportParams(); + TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); User user = userService.getUser(USER_7); - params.setUserId(user.getUid()); + params.setUser(user); params.setAtomicMode(AtomicMode.OBJECT); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1000); assertEquals(2, importReport.getStats().getCreated()); assertEquals(1, importReport.getStats().getIgnored()); @@ -121,9 +114,8 @@ void testNoCreateTeiAccessOutsideCaptureScopeOu() throws IOException { @Test void testUpdateAccessInSearchScopeOu() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); assertEquals(3, importReport.getStats().getCreated()); // For some reason teiSearchOrgunits is not created properly from @@ -133,30 +125,29 @@ void testUpdateAccessInSearchScopeOu() throws IOException { user.setTeiSearchOrganisationUnits(new HashSet<>(user.getDataViewOrganisationUnits())); userService.updateUser(user); dbmsManager.clearSession(); - trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); + params = fromJson("tracker/validations/te-data_with_different_ou.json"); user = userService.getUser(USER_8); - params.setUserId(user.getUid()); + params.setUser(user); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); params.setAtomicMode(AtomicMode.OBJECT); - importReport = trackerImportService.importTracker(params, trackerObjects); + importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); assertEquals(3, importReport.getStats().getUpdated()); } @Test void testNoUpdateAccessOutsideSearchScopeOu() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); assertEquals(3, importReport.getStats().getCreated()); dbmsManager.clearSession(); - trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); + params = fromJson("tracker/validations/te-data_with_different_ou.json"); User user = userService.getUser(USER_7); - params.setUserId(user.getUid()); + params.setUser(user); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); params.setAtomicMode(AtomicMode.OBJECT); - importReport = trackerImportService.importTracker(params, trackerObjects); + importReport = trackerImportService.importTracker(params); assertHasOnlyErrors(importReport, ValidationCode.E1003); assertEquals(2, importReport.getStats().getUpdated()); assertEquals(1, importReport.getStats().getIgnored()); @@ -164,89 +155,81 @@ void testNoUpdateAccessOutsideSearchScopeOu() throws IOException { @Test void testNoWriteAccessInAcl() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_ok.json"); - TrackerImportParams params = new TrackerImportParams(); + TrackerImportParams params = fromJson("tracker/validations/te-data_ok.json"); User user = userService.getUser(USER_1); - params.setUserId(user.getUid()); + params.setUser(user); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasErrors(importReport, 13, ValidationCode.E1001); } @Test void testWriteAccessInAclViaUserGroup() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_ok.json"); - TrackerImportParams params = new TrackerImportParams(); + TrackerImportParams params = fromJson("tracker/validations/te-data_ok.json"); User user = userService.getUser(USER_3); params.setUserId(user.getUid()); - params.setUserId(user.getUid()); + params.setUser(user); user.setPassword("user4password"); injectSecurityContext(user); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } @Test void testGeoOk() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_error_geo-ok.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + TrackerImportParams params = fromJson("tracker/validations/te-data_error_geo-ok.json"); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } @Test void testTeAttrNonExistentAttr() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/te-data_error_attr-non-existing.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasErrors(importReport, 2, ValidationCode.E1006); } @Test void testDeleteCascadeEnrollments() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_te-data.json"); - TrackerImportParams params = new TrackerImportParams(); - assertNoErrors(trackerImportService.importTracker(params, trackerObjects)); + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_te-data.json"); + assertNoErrors(trackerImportService.importTracker(params)); importEnrollments(); manager.flush(); manager.clear(); - trackerObjects = fromJson("tracker/validations/enrollments_te_te-data.json"); + params = fromJson("tracker/validations/enrollments_te_te-data.json"); User user2 = userService.getUser(USER_4); - params.setUserId(user2.getUid()); + params.setUser(user2); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertHasErrors(importReport, 2, ValidationCode.E1100); } @Test void testTeDeleteOk() throws IOException { - TrackerObjects trackerObjects = fromJson("tracker/validations/te-data.json"); - TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); + TrackerImportParams params = fromJson("tracker/validations/te-data.json"); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); manager.flush(); manager.clear(); - TrackerObjects deleteTrackerObjects = fromJson("tracker/validations/te-data-delete.json"); - params.setImportStrategy(TrackerImportStrategy.DELETE); + TrackerImportParams paramsDelete = fromJson("tracker/validations/te-data-delete.json"); + paramsDelete.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReportDelete = - trackerImportService.importTracker(params, deleteTrackerObjects); + ImportReport importReportDelete = trackerImportService.importTracker(paramsDelete); assertNoErrors(importReportDelete); assertEquals(1, importReportDelete.getStats().getDeleted()); } protected void importEnrollments() throws IOException { - TrackerObjects trackerObjects = + TrackerImportParams params = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = - trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); + ImportReport importReport = trackerImportService.importTracker(params); assertNoErrors(importReport); } } diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java index 62d15b1863a8..d0a0837fe6bf 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java @@ -28,7 +28,7 @@ package org.hisp.dhis.webapi.controller.tracker.imports; import org.hisp.dhis.web.HttpStatus; -import org.hisp.dhis.webapi.DhisControllerIntegrationTest; +import org.hisp.dhis.webapi.DhisControllerConvenienceTest; import org.junit.jupiter.api.Test; /** @@ -37,7 +37,7 @@ * * @author Jan Bernitt */ -class TrackerImportControllerTest extends DhisControllerIntegrationTest { +class TrackerImportControllerTest extends DhisControllerConvenienceTest { @Test void shouldSucceedWhenAllValidParametersArePassed() { assertWebMessage( diff --git a/dhis-2/dhis-web-api/pom.xml b/dhis-2/dhis-web-api/pom.xml index 10823ccd10f0..6a0c8894417b 100644 --- a/dhis-2/dhis-web-api/pom.xml +++ b/dhis-2/dhis-web-api/pom.xml @@ -214,6 +214,10 @@ org.hisp.dhis.rules rule-engine + + org.hisp.dhis + dhis-support-artemis + org.hisp.dhis dhis-service-acl diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java index b60d474a7065..6ab8f2d79861 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java @@ -29,7 +29,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; import lombok.AllArgsConstructor; @@ -55,7 +54,7 @@ @NoArgsConstructor @AllArgsConstructor @JsonDeserialize(converter = BodyConverter.class) -class Body implements Serializable { +class Body { /** Tracked entities to import. */ @JsonProperty @Builder.Default private final List trackedEntities = new ArrayList<>(); diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java new file mode 100644 index 000000000000..50ecec4368ad --- /dev/null +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.webapi.controller.tracker.imports; + +import javax.annotation.Nonnull; +import lombok.RequiredArgsConstructor; +import org.hisp.dhis.artemis.MessageManager; +import org.hisp.dhis.artemis.Topics; +import org.hisp.dhis.security.AuthenticationSerializer; +import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.job.TrackerMessage; +import org.hisp.dhis.tracker.imports.report.ImportReport; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +/** + * @author Luca Cambi + */ +@Component +@RequiredArgsConstructor +public class TrackerAsyncImporter { + @Nonnull private final MessageManager messageManager; + + public ImportReport importTracker( + TrackerImportParams params, Authentication authentication, String uid) { + TrackerMessage trackerMessage = + TrackerMessage.builder() + .trackerImportParams(params) + .authentication(AuthenticationSerializer.serialize(authentication)) + .uid(uid) + .build(); + + messageManager.sendQueue(Topics.TRACKER_IMPORT_JOB_TOPIC_NAME, trackerMessage); + + return null; // empty report is not + // returned + // in async creation + } +} diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java index e882355a4df9..2610b91c51ac 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java @@ -32,33 +32,28 @@ import static org.hisp.dhis.webapi.utils.ContextUtils.setNoStore; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.ObjectOutputStream; import java.util.Deque; import java.util.List; import java.util.Optional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.DhisApiVersion; import org.hisp.dhis.common.OpenApi; import org.hisp.dhis.commons.util.StreamUtils; import org.hisp.dhis.dxf2.webmessage.WebMessage; -import org.hisp.dhis.feedback.ConflictException; import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobConfigurationService; -import org.hisp.dhis.scheduling.JobSchedulerService; import org.hisp.dhis.scheduling.JobType; import org.hisp.dhis.system.notification.Notification; import org.hisp.dhis.system.notification.Notifier; import org.hisp.dhis.tracker.imports.TrackerBundleReportMode; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.job.TrackerJobWebMessageResponse; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.hisp.dhis.user.CurrentUser; @@ -70,7 +65,7 @@ import org.locationtech.jts.io.ParseException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.util.MimeType; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -92,60 +87,33 @@ public class TrackerImportController { static final String TRACKER_JOB_ADDED = "Tracker job added"; + private final TrackerSyncImporter syncImporter; + + private final TrackerAsyncImporter asyncImporter; + private final TrackerImportService trackerImportService; private final CsvService csvEventService; private final Notifier notifier; - private final JobSchedulerService jobSchedulerService; - - private final JobConfigurationService jobConfigurationService; - @PostMapping(value = "", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) @ResponseBody public WebMessage asyncPostJsonTracker( HttpServletRequest request, RequestParams requestParams, @CurrentUser User currentUser, - @RequestBody Body body) - throws ConflictException, NotFoundException, IOException { + @RequestBody Body body) { + String jobId = CodeGenerator.generateUid(); TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), requestParams); - TrackerObjects trackerObjects = - TrackerImportParamsMapper.trackerObjects(body, trackerImportParams.getIdSchemes()); - - return startAsyncTracker( - trackerImportParams, - MimeType.valueOf("application/json"), - trackerObjects, - currentUser, - request); - } + TrackerImportParamsMapper.trackerImportParams( + true, jobId, currentUser.getUid(), requestParams, body); - private WebMessage startAsyncTracker( - TrackerImportParams params, - MimeType contentType, - TrackerObjects trackerObjects, - User user, - HttpServletRequest request) - throws IOException, ConflictException, NotFoundException { - JobConfiguration config = new JobConfiguration(JobType.TRACKER_IMPORT_JOB); - config.setExecutedBy(user.getUid()); - config.setJobParameters(params); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); + asyncImporter.importTracker( + trackerImportParams, SecurityContextHolder.getContext().getAuthentication(), jobId); - oos.writeObject(trackerObjects); - - oos.flush(); - oos.close(); - - InputStream is = new ByteArrayInputStream(baos.toByteArray()); - - jobSchedulerService.executeNow(jobConfigurationService.create(config, contentType, is)); - String jobId = config.getUid(); String location = ContextUtils.getRootPath(request) + "/tracker/jobs/" + jobId; + return ok(TRACKER_JOB_ADDED) .setLocation("/tracker/jobs/" + jobId) .setResponse(TrackerJobWebMessageResponse.builder().id(jobId).location(location).build()); @@ -157,13 +125,12 @@ private WebMessage startAsyncTracker( params = {"async=false"}) public ResponseEntity syncPostJsonTracker( RequestParams requestParams, @CurrentUser User currentUser, @RequestBody Body body) { - TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), requestParams); - TrackerObjects trackerObjects = - TrackerImportParamsMapper.trackerObjects(body, params.getIdSchemes()); - ImportReport importReport = - trackerImportService.buildImportReport( - trackerImportService.importTracker(params, trackerObjects), params.getReportMode()); + String jobId = CodeGenerator.generateUid(); + TrackerImportParams trackerImportParams = + TrackerImportParamsMapper.trackerImportParams( + false, jobId, currentUser.getUid(), requestParams, body); + + ImportReport importReport = syncImporter.importTracker(trackerImportParams); ResponseEntity.BodyBuilder builder = importReport.getStatus() == Status.ERROR @@ -183,25 +150,26 @@ public WebMessage asyncPostCsvTracker( RequestParams importRequest, @CurrentUser User currentUser, @RequestParam(required = false, defaultValue = "true") boolean skipFirst) - throws IOException, ParseException, ConflictException, NotFoundException { + throws IOException, ParseException { InputStream inputStream = StreamUtils.wrapAndCheckCompressionFormat(request.getInputStream()); List events = csvEventService.read(inputStream, skipFirst); Body body = Body.builder().events(events).build(); + String jobId = CodeGenerator.generateUid(); TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), importRequest); + TrackerImportParamsMapper.trackerImportParams( + true, jobId, currentUser.getUid(), importRequest, body); - TrackerObjects trackerObjects = - TrackerImportParamsMapper.trackerObjects(body, trackerImportParams.getIdSchemes()); + asyncImporter.importTracker( + trackerImportParams, SecurityContextHolder.getContext().getAuthentication(), jobId); + + String location = ContextUtils.getRootPath(request) + "/tracker/jobs/" + jobId; - return startAsyncTracker( - trackerImportParams, - MimeType.valueOf("application/csv"), - trackerObjects, - currentUser, - request); + return ok(TRACKER_JOB_ADDED) + .setLocation("/tracker/jobs/" + jobId) + .setResponse(TrackerJobWebMessageResponse.builder().id(jobId).location(location).build()); } @PostMapping( @@ -221,14 +189,12 @@ public ResponseEntity syncPostCsvTracker( List events = csvEventService.read(inputStream, skipFirst); Body body = Body.builder().events(events).build(); + String jobId = CodeGenerator.generateUid(); TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), importRequest); - TrackerObjects trackerObjects = - TrackerImportParamsMapper.trackerObjects(body, trackerImportParams.getIdSchemes()); - ImportReport importReport = - trackerImportService.buildImportReport( - trackerImportService.importTracker(trackerImportParams, trackerObjects), - trackerImportParams.getReportMode()); + TrackerImportParamsMapper.trackerImportParams( + false, jobId, currentUser.getUid(), importRequest, body); + + ImportReport importReport = syncImporter.importTracker(trackerImportParams); ResponseEntity.BodyBuilder builder = importReport.getStatus() == Status.ERROR @@ -255,6 +221,6 @@ public ImportReport getJobReport( return Optional.ofNullable(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)) .map(report -> trackerImportService.buildImportReport((ImportReport) report, reportMode)) - .orElseThrow(() -> new NotFoundException("Summary for job " + uid + " does not exist")); + .orElseThrow(() -> new NotFoundException(JobConfiguration.class, uid)); } } diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java deleted file mode 100644 index 518fcf6b72fe..000000000000 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.webapi.controller.tracker.imports; - -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.util.function.Consumer; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.hisp.dhis.fileresource.FileResource; -import org.hisp.dhis.fileresource.FileResourceService; -import org.hisp.dhis.scheduling.Job; -import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobProgress; -import org.hisp.dhis.scheduling.JobType; -import org.hisp.dhis.system.notification.Notifier; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; -import org.hisp.dhis.tracker.imports.report.ImportReport; -import org.hisp.dhis.tracker.imports.report.Stats; -import org.hisp.dhis.tracker.imports.report.Status; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class TrackerImportJob implements Job { - private final TrackerImportService trackerImportService; - private final FileResourceService fileResourceService; - private final Notifier notifier; - - @Override - public JobType getJobType() { - return JobType.TRACKER_IMPORT_JOB; - } - - @Override - public void execute(JobConfiguration config, JobProgress progress) { - progress.startingProcess("Tracker import started"); - TrackerImportParams params = (TrackerImportParams) config.getJobParameters(); - progress.startingStage("Loading file resource"); - FileResource data = - progress.runStage(() -> fileResourceService.getFileResource(config.getUid())); - progress.startingStage("Loading file content"); - try (InputStream input = - progress.runStage(() -> fileResourceService.getFileResourceContent(data))) { - ImportReport report = - trackerImportService.importTracker(params, toTrackerObjects(input), progress); - if (report == null) { - progress.failedProcess("Import failed, no summary available"); - return; - } - notifier.addJobSummary(config, report, ImportReport.class); - Stats stats = report.getStats(); - Consumer endProcess = - report.getStatus() == Status.ERROR ? progress::failedProcess : progress::completedProcess; - endProcess.accept( - "Import complete with status %s, %d created, %d updated, %d deleted, %d ignored" - .formatted( - report.getStatus(), - stats.getCreated(), - stats.getUpdated(), - stats.getDeleted(), - stats.getIgnored())); - } catch (Exception ex) { - progress.failedProcess(ex); - } - } - - private TrackerObjects toTrackerObjects(InputStream input) - throws IOException, ClassNotFoundException { - ObjectInputStream ois = new ObjectInputStream(input); - return (TrackerObjects) ois.readObject(); - } -} diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java index e1de076a1d4b..5eb64ff0609d 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java @@ -27,10 +27,11 @@ */ package org.hisp.dhis.webapi.controller.tracker.imports; +import org.hisp.dhis.scheduling.JobConfiguration; +import org.hisp.dhis.scheduling.JobType; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.mapstruct.factory.Mappers; public class TrackerImportParamsMapper { @@ -45,19 +46,10 @@ public class TrackerImportParamsMapper { private static final RelationshipMapper RELATIONSHIP_MAPPER = Mappers.getMapper(RelationshipMapper.class); - public static TrackerObjects trackerObjects(Body body, TrackerIdSchemeParams idSchemeParams) { - return TrackerObjects.builder() - .trackedEntities( - TRACKED_ENTITY_MAPPER.fromCollection(body.getTrackedEntities(), idSchemeParams)) - .enrollments(ENROLLMENT_MAPPER.fromCollection(body.getEnrollments(), idSchemeParams)) - .events(EVENT_MAPPER.fromCollection(body.getEvents(), idSchemeParams)) - .relationships(RELATIONSHIP_MAPPER.fromCollection(body.getRelationships(), idSchemeParams)) - .build(); - } - private TrackerImportParamsMapper() {} - public static TrackerImportParams trackerImportParams(String userId, RequestParams request) { + public static TrackerImportParams trackerImportParams( + boolean isAsync, String jobId, String userId, RequestParams request, Body params) { TrackerIdSchemeParam defaultIdSchemeParam = request.getIdScheme(); TrackerIdSchemeParams idSchemeParams = TrackerIdSchemeParams.builder() @@ -85,7 +77,21 @@ public static TrackerImportParams trackerImportParams(String userId, RequestPara .skipSideEffects(request.isSkipSideEffects()) .skipRuleEngine(request.isSkipRuleEngine()) .reportMode(request.getReportMode()) - .userId(userId); + .userId(userId) + .trackedEntities( + TRACKED_ENTITY_MAPPER.fromCollection(params.getTrackedEntities(), idSchemeParams)) + .enrollments(ENROLLMENT_MAPPER.fromCollection(params.getEnrollments(), idSchemeParams)) + .events(EVENT_MAPPER.fromCollection(params.getEvents(), idSchemeParams)) + .relationships( + RELATIONSHIP_MAPPER.fromCollection(params.getRelationships(), idSchemeParams)); + + if (!isAsync) { + JobConfiguration jobConfiguration = + new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, userId); + jobConfiguration.setUid(jobId); + paramsBuilder.jobConfiguration(jobConfiguration); + } + return paramsBuilder.build(); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java similarity index 63% rename from dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java rename to dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java index 02a8a89dba76..c48ae7a81316 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java @@ -25,30 +25,27 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.hisp.dhis.tracker.imports.domain; +package org.hisp.dhis.webapi.controller.tracker.imports; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import javax.annotation.Nonnull; +import lombok.RequiredArgsConstructor; +import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.report.ImportReport; +import org.springframework.stereotype.Component; -@Getter -@ToString -@EqualsAndHashCode -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class TrackerObjects implements Serializable { - @JsonProperty @Builder.Default - private final List trackedEntities = new ArrayList<>(); +/** + * @author Luca Cambi + */ +@Component +@RequiredArgsConstructor +public class TrackerSyncImporter { + + @Nonnull private final TrackerImportService trackerImportService; + + public ImportReport importTracker(TrackerImportParams params) { + ImportReport importReport = trackerImportService.importTracker(params); - @JsonProperty @Builder.Default private final List enrollments = new ArrayList<>(); - @JsonProperty @Builder.Default private final List events = new ArrayList<>(); - @JsonProperty @Builder.Default private final List relationships = new ArrayList<>(); + return trackerImportService.buildImportReport(importReport, params.getReportMode()); + } } diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java index 67610dbe6e05..acb52aa69679 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java @@ -29,7 +29,6 @@ import static java.util.Collections.singletonList; import static org.hamcrest.Matchers.hasSize; -import static org.hisp.dhis.scheduling.JobType.TRACKER_IMPORT_JOB; import static org.hisp.dhis.webapi.controller.tracker.imports.TrackerImportController.TRACKER_JOB_ADDED; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -51,8 +50,7 @@ import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.render.DefaultRenderService; import org.hisp.dhis.render.RenderService; -import org.hisp.dhis.scheduling.JobConfigurationService; -import org.hisp.dhis.scheduling.JobSchedulerService; +import org.hisp.dhis.scheduling.JobType; import org.hisp.dhis.schema.SchemaService; import org.hisp.dhis.system.notification.Notification; import org.hisp.dhis.system.notification.Notifier; @@ -60,6 +58,7 @@ import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.report.Status; +import org.hisp.dhis.tracker.imports.report.TimingsStats; import org.hisp.dhis.tracker.imports.report.ValidationReport; import org.hisp.dhis.webapi.controller.CrudControllerAdvice; import org.hisp.dhis.webapi.controller.tracker.ControllerSupport; @@ -86,13 +85,13 @@ class TrackerImportControllerTest { @Mock private DefaultTrackerImportService trackerImportService; - @Mock private CsvService csvEventService; + @Mock private TrackerSyncImporter syncImporter; - @Mock private Notifier notifier; + @Mock private TrackerAsyncImporter asyncImporter; - @Mock private JobSchedulerService jobSchedulerService; + @Mock private CsvService csvEventService; - @Mock private JobConfigurationService jobConfigurationService; + @Mock private Notifier notifier; private RenderService renderService; @@ -107,11 +106,7 @@ public void setUp() { // Controller under test final TrackerImportController controller = new TrackerImportController( - trackerImportService, - csvEventService, - notifier, - jobSchedulerService, - jobConfigurationService); + syncImporter, asyncImporter, trackerImportService, csvEventService, notifier); mockMvc = MockMvcBuilders.standaloneSetup(controller) @@ -145,17 +140,19 @@ void verifyAsyncForCsv() throws Exception { .andExpect(content().contentType("application/json")); verify(csvEventService).read(any(), eq(true)); + verify(asyncImporter).importTracker(any(), any(), any()); } @Test void verifySyncResponseShouldBeOkWhenImportReportStatusIsOk() throws Exception { // When - when(trackerImportService.buildImportReport(any(), any())) + when(syncImporter.importTracker(any())) .thenReturn( ImportReport.withImportCompleted( Status.OK, PersistenceReport.emptyReport(), ValidationReport.emptyReport(), + new TimingsStats(), new HashMap<>())); // Then @@ -173,7 +170,7 @@ void verifySyncResponseShouldBeOkWhenImportReportStatusIsOk() throws Exception { .getResponse() .getContentAsString(); - verify(trackerImportService).importTracker(any(), any()); + verify(syncImporter).importTracker(any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -185,12 +182,13 @@ void verifySyncResponseShouldBeOkWhenImportReportStatusIsOk() throws Exception { @Test void verifySyncResponseForCsvShouldBeOkWhenImportReportStatusIsOk() throws Exception { // When - when(trackerImportService.buildImportReport(any(), any())) + when(syncImporter.importTracker(any())) .thenReturn( ImportReport.withImportCompleted( Status.OK, PersistenceReport.emptyReport(), ValidationReport.emptyReport(), + new TimingsStats(), new HashMap<>())); // Then @@ -208,7 +206,7 @@ void verifySyncResponseForCsvShouldBeOkWhenImportReportStatusIsOk() throws Excep .getContentAsString(); verify(csvEventService).read(any(), eq(true)); - verify(trackerImportService).importTracker(any(), any()); + verify(syncImporter).importTracker(any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -221,8 +219,10 @@ void verifySyncResponseForCsvShouldBeOkWhenImportReportStatusIsOk() throws Excep void verifySyncResponseShouldBeConflictWhenImportReportStatusIsError() throws Exception { String errorMessage = "errorMessage"; // When - when(trackerImportService.buildImportReport(any(), any())) - .thenReturn(ImportReport.withError(errorMessage, ValidationReport.emptyReport())); + when(syncImporter.importTracker(any())) + .thenReturn( + ImportReport.withError( + "errorMessage", ValidationReport.emptyReport(), new TimingsStats())); // Then String contentAsString = @@ -239,7 +239,7 @@ void verifySyncResponseShouldBeConflictWhenImportReportStatusIsError() throws Ex .getResponse() .getContentAsString(); - verify(trackerImportService).importTracker(any(), any()); + verify(syncImporter).importTracker(any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -252,8 +252,10 @@ void verifySyncResponseShouldBeConflictWhenImportReportStatusIsError() throws Ex void verifySyncResponseForCsvShouldBeConflictWhenImportReportStatusIsError() throws Exception { String errorMessage = "errorMessage"; // When - when(trackerImportService.buildImportReport(any(), any())) - .thenReturn(ImportReport.withError(errorMessage, ValidationReport.emptyReport())); + when(syncImporter.importTracker(any())) + .thenReturn( + ImportReport.withError( + "errorMessage", ValidationReport.emptyReport(), new TimingsStats())); // Then String contentAsString = @@ -270,7 +272,7 @@ void verifySyncResponseForCsvShouldBeConflictWhenImportReportStatusIsError() thr .getContentAsString(); verify(csvEventService).read(any(), eq(true)); - verify(trackerImportService).importTracker(any(), any()); + verify(syncImporter).importTracker(any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -283,7 +285,7 @@ void verifySyncResponseForCsvShouldBeConflictWhenImportReportStatusIsError() thr void verifyShouldFindJob() throws Exception { String uid = CodeGenerator.generateUid(); // When - when(notifier.getNotificationsByJobId(TRACKER_IMPORT_JOB, uid)) + when(notifier.getNotificationsByJobId(JobType.TRACKER_IMPORT_JOB, uid)) .thenReturn(new LinkedList<>(singletonList(new Notification()))); // Then @@ -303,7 +305,7 @@ void verifyShouldFindJob() throws Exception { .getResponse() .getContentAsString(); - verify(notifier).getNotificationsByJobId(TRACKER_IMPORT_JOB, uid); + verify(notifier).getNotificationsByJobId(JobType.TRACKER_IMPORT_JOB, uid); } @Test @@ -315,10 +317,11 @@ void verifyShouldFindJobReport() throws Exception { Status.OK, PersistenceReport.emptyReport(), ValidationReport.emptyReport(), + new TimingsStats(), new HashMap<>()); // When - when(notifier.getJobSummaryByJobId(TRACKER_IMPORT_JOB, uid)).thenReturn(importReport); + when(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)).thenReturn(importReport); when(trackerImportService.buildImportReport(any(), any())).thenReturn(importReport); @@ -337,7 +340,7 @@ void verifyShouldFindJobReport() throws Exception { .getResponse() .getContentAsString(); - verify(notifier).getJobSummaryByJobId(TRACKER_IMPORT_JOB, uid); + verify(notifier).getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid); verify(trackerImportService).buildImportReport(any(), any()); try { @@ -352,7 +355,7 @@ void verifyShouldThrowWhenJobReportNotFound() throws Exception { String uid = CodeGenerator.generateUid(); // When - when(notifier.getJobSummaryByJobId(TRACKER_IMPORT_JOB, uid)).thenReturn(null); + when(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)).thenReturn(null); // Then mockMvc diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java index 8cb802fe993d..63e8c827f19e 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java @@ -63,7 +63,8 @@ void testValidationMode() { e -> { RequestParams requestParams = RequestParams.builder().validationMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat(params.getValidationMode(), is(e)); }); } @@ -75,7 +76,8 @@ void testImportMode() { e -> { RequestParams requestParams = RequestParams.builder().importMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat(params.getImportMode(), is(e)); }); } @@ -87,7 +89,8 @@ void testAtomicMode() { e -> { RequestParams requestParams = RequestParams.builder().atomicMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat(params.getAtomicMode(), is(e)); }); } @@ -99,7 +102,8 @@ void testFlushMode() { e -> { RequestParams requestParams = RequestParams.builder().flushMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat(params.getFlushMode(), is(e)); }); } @@ -111,7 +115,8 @@ void testImportStrategy() { e -> { RequestParams requestParams = RequestParams.builder().importStrategy(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat(params.getImportStrategy(), is(e)); }); } @@ -121,7 +126,8 @@ void testIdSchemeUsingIdSchemeName() { RequestParams requestParams = RequestParams.builder().idScheme(TrackerIdSchemeParam.NAME).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); TrackerIdSchemeParam expected = TrackerIdSchemeParam.NAME; assertEquals(expected, params.getIdSchemes().getIdScheme()); @@ -138,7 +144,8 @@ void testIdSchemeUsingIdSchemeAttribute() { RequestParams requestParams = RequestParams.builder().idScheme(TrackerIdSchemeParam.ofAttribute("WSiOAALYocA")).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); TrackerIdSchemeParam expected = TrackerIdSchemeParam.ofAttribute("WSiOAALYocA"); assertEquals(expected, params.getIdSchemes().getIdScheme()); @@ -157,7 +164,8 @@ void testOrgUnitIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().orgUnitIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat( params.getIdSchemes().getOrgUnitIdScheme().getIdScheme(), is(e.getIdScheme())); }); @@ -170,7 +178,8 @@ void testProgramIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().programIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat( params.getIdSchemes().getProgramIdScheme().getIdScheme(), is(e.getIdScheme())); }); @@ -183,7 +192,8 @@ void testProgramIdentifierUsingIdSchemeAttribute() { .programIdScheme(TrackerIdSchemeParam.ofAttribute("WSiOAALYocA")) .build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertEquals( TrackerIdSchemeParam.ofAttribute("WSiOAALYocA"), @@ -197,7 +207,8 @@ void testProgramStageIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().programStageIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat( params.getIdSchemes().getProgramStageIdScheme().getIdScheme(), is(e.getIdScheme())); @@ -211,7 +222,8 @@ void testDataElementIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().dataElementIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat( params.getIdSchemes().getDataElementIdScheme().getIdScheme(), is(e.getIdScheme())); @@ -226,7 +238,8 @@ void testCategoryOptionComboIdentifier() { RequestParams requestParams = RequestParams.builder().categoryOptionComboIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat( params.getIdSchemes().getCategoryOptionComboIdScheme().getIdScheme(), is(e.getIdScheme())); @@ -241,7 +254,8 @@ void testCategoryOptionIdentifier() { RequestParams requestParams = RequestParams.builder().categoryOptionIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams("userId", requestParams); + TrackerImportParamsMapper.trackerImportParams( + true, JOB_ID, "userId", requestParams, Body.builder().build()); assertThat( params.getIdSchemes().getCategoryOptionIdScheme().getIdScheme(), is(e.getIdScheme())); diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java new file mode 100644 index 000000000000..0d1fd39f68b8 --- /dev/null +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.webapi.controller.tracker.imports; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import org.hisp.dhis.artemis.MessageManager; +import org.hisp.dhis.artemis.Topics; +import org.hisp.dhis.scheduling.JobConfiguration; +import org.hisp.dhis.scheduling.JobType; +import org.hisp.dhis.tracker.imports.TrackerBundleReportMode; +import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.job.TrackerMessage; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class TrackerImporterImplTest { + @InjectMocks TrackerAsyncImporter asyncImporter; + + @InjectMocks TrackerSyncImporter syncImporter; + + @Mock TrackerImportService trackerImportService; + + @Mock MessageManager messageManager; + + @Test + void shouldCreateReportSync() { + TrackerImportParams params = + TrackerImportParams.builder() + .jobConfiguration(new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, "userId")) + .reportMode(TrackerBundleReportMode.FULL) + .build(); + + syncImporter.importTracker(params); + + verify(trackerImportService).importTracker(params); + verify(trackerImportService).buildImportReport(any(), eq(TrackerBundleReportMode.FULL)); + } + + @Test + void shouldSendMessageToQueueAsync() { + ArgumentCaptor queueNameCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor trackerMessageCaptor = + ArgumentCaptor.forClass(TrackerMessage.class); + + doNothing() + .when(messageManager) + .sendQueue(queueNameCaptor.capture(), trackerMessageCaptor.capture()); + + TrackerImportParams params = + TrackerImportParams.builder() + .jobConfiguration(new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, "userId")) + .build(); + + asyncImporter.importTracker(params, null, ""); + + verify(trackerImportService, times(0)).importTracker(any()); + verify(messageManager).sendQueue(any(), any()); + assertEquals(Topics.TRACKER_IMPORT_JOB_TOPIC_NAME, queueNameCaptor.getValue()); + assertEquals(params, trackerMessageCaptor.getValue().getTrackerImportParams()); + } +} From 520136b45feb1f4725ab016f3c4ffe4021f33bc4 Mon Sep 17 00:00:00 2001 From: Enrico Colasante Date: Tue, 14 Nov 2023 16:36:58 +0100 Subject: [PATCH 62/63] chore: Make async tracker importer use scheduler (#15684) * "chore: Make async tracker importer use scheduler" This reverts commit bc2befccc341638152bea5a7bbd0da12b87dddbb. * fix: wait until file resource content is available (#15686) * fix: wait until file resource content is available * fix: detect null content for file resources * fix: wait for file content to become available --------- Co-authored-by: Jan Bernitt --- .../fileresource/FileResourceService.java | 22 +- .../FileResourceStorageStatus.java | 1 - .../org/hisp/dhis/scheduling/JobType.java | 3 +- .../DefaultFileResourceService.java | 44 +++- .../JCloudsFileResourceContentStore.java | 1 + .../HibernateJobConfigurationStore.java | 3 + .../dhis-service-tracker/pom.xml | 8 - .../imports/DefaultTrackerImportService.java | 225 ++++-------------- .../dhis/tracker/imports/ParamsConverter.java | 15 +- .../tracker/imports/TrackerIdSchemeParam.java | 3 +- .../imports/TrackerIdSchemeParams.java | 3 +- .../imports/TrackerIdentifierCollector.java | 11 +- .../tracker/imports/TrackerImportParams.java | 60 +---- .../tracker/imports/TrackerImportService.java | 22 +- .../bundle/DefaultTrackerBundleService.java | 10 +- .../imports/bundle/TrackerBundleService.java | 4 +- .../tracker/imports/domain/Attribute.java | 3 +- .../tracker/imports/domain/Coordinate.java | 3 +- .../tracker/imports/domain/DataValue.java | 3 +- .../tracker/imports/domain/Enrollment.java | 3 +- .../dhis/tracker/imports/domain/Event.java | 3 +- .../imports/domain/MetadataIdentifier.java | 3 +- .../dhis/tracker/imports/domain/Note.java | 3 +- .../tracker/imports/domain/Relationship.java | 3 +- .../imports/domain/RelationshipItem.java | 3 +- .../tracker/imports/domain/TrackedEntity.java | 3 +- .../imports/domain/TrackerObjects.java} | 43 ++-- .../dhis/tracker/imports/domain/User.java | 3 +- .../imports/job/TrackerImportThread.java | 62 ----- .../tracker/imports/job/TrackerMessage.java | 62 ----- .../imports/job/TrackerMessageManager.java | 89 ------- .../preheat/DefaultTrackerPreheatService.java | 13 +- .../preheat/TrackerPreheatService.java | 7 +- .../supplier/AbstractPreheatSupplier.java | 8 +- .../preheat/supplier/ClassBasedSupplier.java | 8 +- .../preheat/supplier/DefaultsSupplier.java | 4 +- .../DuplicateRelationshipSupplier.java | 6 +- .../preheat/supplier/EnrollmentSupplier.java | 4 +- ...nrollmentsWithAtLeastOneEventSupplier.java | 4 +- .../EventCategoryOptionComboSupplier.java | 6 +- .../EventProgramStageMapSupplier.java | 10 +- .../supplier/FileResourceSupplier.java | 13 +- .../supplier/OrgUnitValueTypeSupplier.java | 10 +- .../preheat/supplier/PeriodTypeSupplier.java | 4 +- .../preheat/supplier/PreheatSupplier.java | 5 +- .../supplier/ProgramOrgUnitsSupplier.java | 4 +- .../supplier/ProgramOwnerSupplier.java | 8 +- .../TrackedEntityEnrollmentSupplier.java | 8 +- .../supplier/UniqueAttributesSupplier.java | 23 +- .../preheat/supplier/UserSupplier.java | 8 +- .../supplier/UsernameValueTypeSupplier.java | 8 +- .../strategy/AbstractSchemaStrategy.java | 6 +- .../strategy/ClassBasedSupplierStrategy.java | 3 +- .../supplier/strategy/EnrollmentStrategy.java | 4 +- .../supplier/strategy/EventStrategy.java | 4 +- .../supplier/strategy/NoteStrategy.java | 4 +- .../strategy/RelationshipStrategy.java | 4 +- .../strategy/TrackerEntityStrategy.java | 4 +- .../tracker/imports/report/ImportReport.java | 15 +- .../tracker/imports/report/TimingsStats.java | 153 ------------ .../TrackerIdentifierCollectorTest.java | 46 ++-- .../bundle/TrackerImporterServiceTest.java | 40 ++-- .../DefaultTrackerPreheatServiceTest.java | 16 +- .../supplier/ClassBasedSupplierTest.java | 10 +- .../DuplicateRelationshipSupplierTest.java | 8 +- .../supplier/EnrollmentSupplierTest.java | 6 +- .../EventCategoryOptionComboSupplierTest.java | 48 ++-- .../supplier/FileResourceSupplierTest.java | 29 +-- .../OrgUnitValueTypeSupplierTest.java | 29 +-- .../supplier/PeriodTypeSupplierTest.java | 4 +- .../supplier/UniqueAttributeSupplierTest.java | 26 +- .../preheat/supplier/UserSupplierTest.java | 6 +- .../strategy/TrackerEntityStrategyTest.java | 8 +- .../imports/report/ImportReportTest.java | 4 +- .../report/TrackerBundleImportReportTest.java | 64 +---- .../tracker/TrackerImportExportActions.java | 8 + .../tracker/AclEventExporterTest.java | 5 +- .../org/hisp/dhis/tracker/TrackerTest.java | 24 +- .../OrderAndPaginationExporterTest.java | 5 +- .../export/event/AclEventExporterTest.java | 5 +- .../export/event/EventExporterTest.java | 5 +- .../imports/AtomicModeIntegrationTest.java | 16 +- .../imports/TrackerImportParamsSerdeTest.java | 16 +- .../imports/bundle/EventDataValueTest.java | 37 ++- .../imports/bundle/LastUpdateImportTest.java | 33 ++- .../tracker/imports/bundle/OwnershipTest.java | 116 ++++----- .../bundle/RelationshipImportTest.java | 25 +- .../ReportSummaryDeleteIntegrationTest.java | 39 +-- .../bundle/ReportSummaryIntegrationTest.java | 141 ++++++----- .../bundle/TrackedEntityAttributeTest.java | 13 +- .../TrackedEntityAttributeValueAuditTest.java | 15 +- .../TrackedEntityDataValueAuditTest.java | 8 +- ...dEntityProgramAttributeEncryptionTest.java | 2 + ...ntityProgramAttributeFileResourceTest.java | 2 + .../TrackedEntityProgramAttributeTest.java | 34 +-- .../bundle/TrackerBundleServiceTest.java | 9 +- .../bundle/TrackerEventBundleServiceTest.java | 16 +- .../TrackerProgramRuleBundleServiceTest.java | 9 +- .../TrackerSideEffectHandlerServiceTest.java | 2 + .../TrackerPreheatIdentifiersTest.java | 76 +++--- .../TrackerPreheatServiceIntegrationTest.java | 23 +- .../preheat/TrackerPreheatServiceTest.java | 46 ++-- .../ProgramRuleAssignActionTest.java | 22 +- .../imports/programrule/ProgramRuleTest.java | 87 ++++--- .../EnrollmentAttrValidationTest.java | 64 +++-- .../EnrollmentImportValidationTest.java | 82 ++++--- ...nrollmentSecurityImportValidationTest.java | 39 +-- .../validation/EventImportValidationTest.java | 90 ++++--- .../EventSecurityImportValidationTest.java | 24 +- .../TeTaEncryptionValidationTest.java | 26 +- .../validation/TeTaValidationTest.java | 40 ++-- .../TrackedEntityImportValidationTest.java | 103 ++++---- .../imports/TrackerImportControllerTest.java | 4 +- dhis-2/dhis-web-api/pom.xml | 4 - .../TrackedEntityInstanceController.java | 3 +- .../metadata/MetadataImportJob.java | 2 +- .../controller/tracker/imports/Body.java | 3 +- .../tracker/imports/TrackerAsyncImporter.java | 64 ----- .../imports/TrackerImportController.java | 108 ++++++--- .../tracker/imports/TrackerImportJob.java | 102 ++++++++ .../imports/TrackerImportParamsMapper.java | 32 +-- .../TrackerJobWebMessageResponse.java | 7 +- .../imports/TrackerImportControllerTest.java | 57 +++-- .../TrackerImportParamsMapperTest.java | 42 ++-- .../imports/TrackerImporterImplTest.java | 98 -------- 125 files changed, 1406 insertions(+), 1853 deletions(-) rename dhis-2/{dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java => dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java} (63%) delete mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java delete mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java delete mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java delete mode 100644 dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java delete mode 100644 dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java create mode 100644 dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java rename dhis-2/{dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job => dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports}/TrackerJobWebMessageResponse.java (92%) delete mode 100644 dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/fileresource/FileResourceService.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/fileresource/FileResourceService.java index bedcd14e40a0..92e43b63b40c 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/fileresource/FileResourceService.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/fileresource/FileResourceService.java @@ -32,18 +32,33 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URI; +import java.time.Duration; import java.util.List; import java.util.NoSuchElementException; import java.util.Optional; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import org.hisp.dhis.feedback.ConflictException; +import org.hisp.dhis.feedback.NotFoundException; /** * @author Halvdan Hoem Grelland */ public interface FileResourceService { + + @CheckForNull FileResource getFileResource(String uid); + /** + * Get the {@link FileResource} with the given ID + * + * @param uid the resource to fetch + * @return the file resource + * @throws NotFoundException when no such file resource exits + */ + @Nonnull + FileResource getExistingFileResource(String uid) throws NotFoundException; + /** * Lookup a {@link FileResource} by uid and {@link FileResourceDomain}. * @@ -83,7 +98,12 @@ public interface FileResourceService { void deleteFileResource(FileResource fileResource); - InputStream getFileResourceContent(FileResource fileResource); + @Nonnull + InputStream getFileResourceContent(FileResource fileResource) throws ConflictException; + + @Nonnull + InputStream getFileResourceContent(FileResource fileResource, Duration timeout) + throws ConflictException; /** Copy fileResource content to outputStream and Return File content length */ void copyFileResourceContent(FileResource fileResource, OutputStream outputStream) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/fileresource/FileResourceStorageStatus.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/fileresource/FileResourceStorageStatus.java index 517550c01ec3..c2c77dad7aa4 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/fileresource/FileResourceStorageStatus.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/fileresource/FileResourceStorageStatus.java @@ -33,6 +33,5 @@ public enum FileResourceStorageStatus { NONE, // No content stored PENDING, // In transit to store, not available - FAILED, // Storing the resource failed STORED // Is available from store } diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java index 7357c130c46c..7b51389db2d9 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/scheduling/JobType.java @@ -206,6 +206,7 @@ public boolean isUsingNotifications() { || this == DATAVALUE_IMPORT || this == COMPLETE_DATA_SET_REGISTRATION_IMPORT || this == METADATA_IMPORT + || this == TRACKER_IMPORT_JOB || this == GEOJSON_IMPORT; } @@ -231,7 +232,7 @@ public boolean isUsingErrorNotification() { * the ready jobs per type is attempted to start in a single loop cycle */ public boolean isUsingContinuousExecution() { - return this == METADATA_IMPORT; + return this == METADATA_IMPORT || this == TRACKER_IMPORT_JOB; } public boolean hasJobParameters() { diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/fileresource/DefaultFileResourceService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/fileresource/DefaultFileResourceService.java index 708222a7eccf..96c46639bcdc 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/fileresource/DefaultFileResourceService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/fileresource/DefaultFileResourceService.java @@ -27,6 +27,10 @@ */ package org.hisp.dhis.fileresource; +import static java.lang.System.currentTimeMillis; +import static java.time.Duration.ofMillis; +import static java.time.Duration.ofSeconds; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -43,7 +47,9 @@ import lombok.RequiredArgsConstructor; import org.hibernate.SessionFactory; import org.hisp.dhis.common.IllegalQueryException; +import org.hisp.dhis.feedback.ConflictException; import org.hisp.dhis.feedback.ErrorCode; +import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.fileresource.events.BinaryFileSavedEvent; import org.hisp.dhis.fileresource.events.FileDeletedEvent; import org.hisp.dhis.fileresource.events.FileSavedEvent; @@ -86,6 +92,15 @@ public class DefaultFileResourceService implements FileResourceService { // FileResourceService implementation // ------------------------------------------------------------------------- + @Nonnull + @Override + @Transactional(readOnly = true) + public FileResource getExistingFileResource(String uid) throws NotFoundException { + FileResource fr = fileResourceStore.getByUid(uid); + if (fr == null) throw new NotFoundException(FileResource.class, uid); + return fr; + } + @Override @Transactional(readOnly = true) public FileResource getFileResource(String uid) { @@ -228,26 +243,43 @@ public void deleteFileResource(FileResource fileResource) { } @Override - @Transactional(readOnly = true) - public InputStream getFileResourceContent(FileResource fileResource) { - return fileResourceContentStore.getFileResourceContent(fileResource.getStorageKey()); + @Nonnull + public InputStream getFileResourceContent(FileResource fileResource) throws ConflictException { + return getFileResourceContent(fileResource, ofSeconds(10)); + } + + @Nonnull + @Override + public InputStream getFileResourceContent(FileResource fileResource, java.time.Duration timeout) + throws ConflictException { + String key = fileResource.getStorageKey(); + InputStream content = fileResourceContentStore.getFileResourceContent(key); + long since = currentTimeMillis(); + while (content == null && !timeout.minus(ofMillis(currentTimeMillis() - since)).isNegative()) { + try { + Thread.sleep(50); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + content = fileResourceContentStore.getFileResourceContent(key); + } + if (content == null) + throw new ConflictException("File resource exists but content input stream was null"); + return content; } @Override - @Transactional(readOnly = true) public long getFileResourceContentLength(FileResource fileResource) { return fileResourceContentStore.getFileResourceContentLength(fileResource.getStorageKey()); } @Override - @Transactional(readOnly = true) public void copyFileResourceContent(FileResource fileResource, OutputStream outputStream) throws IOException, NoSuchElementException { fileResourceContentStore.copyContent(fileResource.getStorageKey(), outputStream); } @Override - @Transactional(readOnly = true) public byte[] copyFileResourceContent(FileResource fileResource) throws IOException, NoSuchElementException { return fileResourceContentStore.copyContent(fileResource.getStorageKey()); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/fileresource/JCloudsFileResourceContentStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/fileresource/JCloudsFileResourceContentStore.java index 63c6e70f4702..0c9ada0ea604 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/fileresource/JCloudsFileResourceContentStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/fileresource/JCloudsFileResourceContentStore.java @@ -194,6 +194,7 @@ public InputStream getFileResourceContent(String key) { final Blob blob = getBlob(key); if (blob == null) { + return null; } diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java index be63df14bf74..44653469e464 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/scheduling/HibernateJobConfigurationStore.java @@ -29,6 +29,7 @@ import static java.lang.Math.max; import static java.util.stream.Collectors.toSet; +import static org.springframework.transaction.annotation.Propagation.REQUIRES_NEW; import java.util.List; import java.util.Set; @@ -45,6 +46,7 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; /** * @author Jan Bernitt @@ -242,6 +244,7 @@ public Stream getDueJobConfigurations(boolean includeWaiting) } @Override + @Transactional(propagation = REQUIRES_NEW) public boolean tryExecuteNow(@Nonnull String jobId) { // language=SQL String sql = diff --git a/dhis-2/dhis-services/dhis-service-tracker/pom.xml b/dhis-2/dhis-services/dhis-service-tracker/pom.xml index 393e2d329c1a..542a8b642f0d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/pom.xml +++ b/dhis-2/dhis-services/dhis-service-tracker/pom.xml @@ -65,10 +65,6 @@ org.hisp.dhis.rules rule-engine - - org.springframework - spring-core - org.springframework spring-jdbc @@ -89,10 +85,6 @@ org.springframework spring-beans - - org.springframework.security - spring-security-core - org.projectlombok lombok diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java index ccf754014a01..b203d58bbc68 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/DefaultTrackerImportService.java @@ -27,35 +27,25 @@ */ package org.hisp.dhis.tracker.imports; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.COMMIT_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREHEAT_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREPROCESS_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PROGRAMRULE_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.TOTAL_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.VALIDATE_PROGRAMRULE_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.VALIDATION_OPS; - import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.Nonnull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.hisp.dhis.system.notification.NotificationLevel; -import org.hisp.dhis.system.notification.Notifier; +import org.hisp.dhis.scheduling.JobProgress; import org.hisp.dhis.tracker.TrackerType; import org.hisp.dhis.tracker.imports.bundle.TrackerBundle; import org.hisp.dhis.tracker.imports.bundle.TrackerBundleService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.job.TrackerSideEffectDataBundle; import org.hisp.dhis.tracker.imports.preprocess.TrackerPreprocessService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.report.Status; -import org.hisp.dhis.tracker.imports.report.TimingsStats; import org.hisp.dhis.tracker.imports.report.TrackerTypeReport; import org.hisp.dhis.tracker.imports.report.ValidationReport; import org.hisp.dhis.tracker.imports.validation.ValidationResult; @@ -78,144 +68,78 @@ public class DefaultTrackerImportService implements TrackerImportService { @Nonnull private final TrackerUserService trackerUserService; - @Nonnull private final Notifier notifier; - + /* Import is not meant to be annotated with @Transactional. + * PreHeat and Commit phases are separated transactions, other + * phases do not need to be in a transaction. */ @Override - public ImportReport importTracker(TrackerImportParams params) { + public ImportReport importTracker( + TrackerImportParams params, TrackerObjects trackerObjects, JobProgress jobProgress) { User user = trackerUserService.getUser(params.getUserId()); - params.setUser(user); - - TimingsStats opsTimer = new TimingsStats(); - - startImport(params); - - try { - TrackerBundle trackerBundle = preHeat(params, opsTimer); - - Map bundleSize = calculatePayloadSize(trackerBundle); - - preProcess(opsTimer, trackerBundle); - - ValidationReport validationReport = validate(params, opsTimer, trackerBundle); - if (exitOnError(validationReport, params)) { - return buildReportAndNotify(params, validationReport, opsTimer, bundleSize); - } + jobProgress.startingStage("Running PreHeat"); + TrackerBundle trackerBundle = + jobProgress.runStage(() -> trackerBundleService.create(params, trackerObjects, user)); - PersistenceReport persistenceReport = commit(params, opsTimer, trackerBundle); + jobProgress.startingStage("Calculating Payload Size"); + Map bundleSize = + jobProgress.runStage(() -> calculatePayloadSize(trackerBundle)); - postCommit(trackerBundle); + jobProgress.startingStage("Running PreProcess"); + jobProgress.runStage(() -> trackerPreprocessService.preprocess(trackerBundle)); - ImportReport importReport = - ImportReport.withImportCompleted( - Status.OK, persistenceReport, validationReport, opsTimer.stopTimer(), bundleSize); + jobProgress.startingStage("Running Validation"); + ValidationResult validationResult = jobProgress.runStage(() -> validateBundle(trackerBundle)); - endImport(params, importReport); + ValidationReport validationReport = ValidationReport.fromResult(validationResult); - return importReport; - } catch (Exception e) { - log.error("Exception thrown during import.", e); - - ImportReport report = - ImportReport.withError( - "Exception:" + e.getMessage(), ValidationReport.emptyReport(), opsTimer.stopTimer()); - - endImportWithError(params, report, e); - - return report; + if (!trackerBundle.isSkipRuleEngine() && !params.getImportStrategy().isDelete()) { + jobProgress.startingStage("Running Rule Engine"); + jobProgress.runStage(() -> trackerBundleService.runRuleEngine(trackerBundle)); + + jobProgress.startingStage("Running Rule Engine Validation"); + ValidationResult result = + jobProgress.runStage(() -> validationService.validateRuleEngine(trackerBundle)); + trackerBundle.setTrackedEntities(result.getTrackedEntities()); + trackerBundle.setEnrollments(result.getEnrollments()); + trackerBundle.setEvents(result.getEvents()); + trackerBundle.setRelationships(result.getRelationships()); + + validationReport = ValidationReport.merge(validationResult, result); } - } - - private TrackerBundle preHeat(TrackerImportParams params, TimingsStats opsTimer) { - TrackerBundle trackerBundle = opsTimer.exec(PREHEAT_OPS, () -> preheatBundle(params)); - - notifyOps(params, PREHEAT_OPS, opsTimer); - return trackerBundle; - } - - private void preProcess(TimingsStats opsTimer, TrackerBundle trackerBundle) { - opsTimer.execVoid(PREPROCESS_OPS, () -> preProcessBundle(trackerBundle)); - } - - private ValidationReport validate( - TrackerImportParams params, TimingsStats opsTimer, TrackerBundle trackerBundle) { - ValidationResult validationResult = - opsTimer.exec(VALIDATION_OPS, () -> validateBundle(params, trackerBundle, opsTimer)); + if (exitOnError(validationReport, params)) { + return ImportReport.withValidationErrors( + validationReport, bundleSize.values().stream().mapToInt(Integer::intValue).sum()); + } - if (!trackerBundle.isSkipRuleEngine() && !params.getImportStrategy().isDelete()) { - ValidationResult ruleEnginevalidationResult = execRuleEngine(params, opsTimer, trackerBundle); + jobProgress.startingStage("Commit Transaction"); + PersistenceReport persistenceReport = jobProgress.runStage(() -> commit(params, trackerBundle)); - return ValidationReport.merge(validationResult, ruleEnginevalidationResult); - } + jobProgress.startingStage("PostCommit"); + jobProgress.runStage(() -> trackerBundleService.postCommit(trackerBundle)); - return ValidationReport.fromResult(validationResult); + return ImportReport.withImportCompleted( + Status.OK, persistenceReport, validationReport, bundleSize); } - private PersistenceReport commit( - TrackerImportParams params, TimingsStats opsTimer, TrackerBundle trackerBundle) { - PersistenceReport persistenceReport; + private PersistenceReport commit(TrackerImportParams params, TrackerBundle trackerBundle) { if (TrackerImportStrategy.DELETE == params.getImportStrategy()) { - persistenceReport = opsTimer.exec(COMMIT_OPS, () -> deleteBundle(trackerBundle)); + return deleteBundle(trackerBundle); } else { - persistenceReport = opsTimer.exec(COMMIT_OPS, () -> commitBundle(trackerBundle)); + return commitBundle(trackerBundle); } - - notifyOps(params, COMMIT_OPS, opsTimer); - return persistenceReport; - } - - private void postCommit(TrackerBundle trackerBundle) { - trackerBundleService.postCommit(trackerBundle); } - protected ValidationResult validateBundle( - TrackerImportParams params, TrackerBundle bundle, TimingsStats opsTimer) { + protected ValidationResult validateBundle(TrackerBundle bundle) { ValidationResult result = validationService.validate(bundle); bundle.setTrackedEntities(result.getTrackedEntities()); bundle.setEnrollments(result.getEnrollments()); bundle.setEvents(result.getEvents()); bundle.setRelationships(result.getRelationships()); - notifyOps(params, VALIDATION_OPS, opsTimer); - - return result; - } - - private ValidationResult execRuleEngine( - TrackerImportParams params, TimingsStats opsTimer, TrackerBundle bundle) { - opsTimer.execVoid(PROGRAMRULE_OPS, () -> trackerBundleService.runRuleEngine(bundle)); - - notifyOps(params, PROGRAMRULE_OPS, opsTimer); - - ValidationResult result = - opsTimer.exec(VALIDATE_PROGRAMRULE_OPS, () -> validationService.validateRuleEngine(bundle)); - bundle.setTrackedEntities(result.getTrackedEntities()); - bundle.setEnrollments(result.getEnrollments()); - bundle.setEvents(result.getEvents()); - bundle.setRelationships(result.getRelationships()); - - notifyOps(params, VALIDATE_PROGRAMRULE_OPS, opsTimer); - return result; } - private ImportReport buildReportAndNotify( - TrackerImportParams params, - ValidationReport validationReport, - TimingsStats opsTimer, - Map bundleSize) { - ImportReport importReport = - ImportReport.withValidationErrors( - validationReport, - opsTimer.stopTimer(), - bundleSize.values().stream().mapToInt(Integer::intValue).sum()); - - endImport(params, importReport); - - return importReport; - } - private boolean exitOnError(ValidationReport validationReport, TrackerImportParams params) { return validationReport.hasErrors() && params.getAtomicMode() == AtomicMode.ALL; } @@ -228,14 +152,6 @@ private Map calculatePayloadSize(TrackerBundle bundle) { TrackerType.RELATIONSHIP, bundle.getRelationships().size()); } - protected TrackerBundle preheatBundle(TrackerImportParams params) { - return trackerBundleService.create(params); - } - - protected void preProcessBundle(TrackerBundle bundle) { - trackerPreprocessService.preprocess(bundle); - } - protected PersistenceReport commitBundle(TrackerBundle trackerBundle) { PersistenceReport persistenceReport = trackerBundleService.commit(trackerBundle); @@ -244,7 +160,7 @@ protected PersistenceReport commitBundle(TrackerBundle trackerBundle) { Stream.of(TrackerType.ENROLLMENT, TrackerType.EVENT) .map(trackerType -> safelyGetSideEffectsDataBundles(persistenceReport, trackerType)) .flatMap(Collection::stream) - .collect(Collectors.toList()); + .toList(); trackerBundleService.handleTrackerSideEffects(sideEffectDataBundles); } @@ -265,48 +181,6 @@ protected PersistenceReport deleteBundle(TrackerBundle trackerBundle) { return trackerBundleService.delete(trackerBundle); } - private void startImport(TrackerImportParams params) { - if (null != params.getJobConfiguration()) { - notifier.notify(params.getJobConfiguration(), params.userStartInfo() + " Import:Start"); - } - } - - private void notifyOps(TrackerImportParams params, String validationOps, TimingsStats opsTimer) { - if (null != params.getJobConfiguration()) { - notifier.update( - params.getJobConfiguration(), - NotificationLevel.DEBUG, - params - + validationOps - + " completed in " - + opsTimer.get(validationOps) - + " Import:" - + validationOps); - } - } - - private void endImport(TrackerImportParams params, ImportReport importReport) { - if (null != params.getJobConfiguration()) { - notifier.update( - params.getJobConfiguration(), - params + " finished in " + importReport.getTimingsStats().get(TOTAL_OPS) + " Import:Done", - true); - - notifier.addJobSummary(params.getJobConfiguration(), importReport, ImportReport.class); - } - } - - private void endImportWithError( - TrackerImportParams params, ImportReport importReport, Exception e) { - notifier.update( - params.getJobConfiguration(), - NotificationLevel.ERROR, - params + " failed with exception: " + e.getMessage() + " Import:Error", - true); - - notifier.addJobSummary(params.getJobConfiguration(), importReport, ImportReport.class); - } - /** * Clone the TrackerImportReport and filters out validation data based on the provided {@link * PersistenceReport}. @@ -328,11 +202,10 @@ public ImportReport buildImportReport( if (originalValidationReport != null) { validationReport.addErrors(originalValidationReport.getErrors()); } - if (originalValidationReport != null && TrackerBundleReportMode.WARNINGS == reportMode) { - validationReport.addWarnings(originalValidationReport.getWarnings()); - } else if (originalValidationReport != null && TrackerBundleReportMode.FULL == reportMode) { + if (originalValidationReport != null + && (TrackerBundleReportMode.WARNINGS == reportMode + || TrackerBundleReportMode.FULL == reportMode)) { validationReport.addWarnings(originalValidationReport.getWarnings()); - importReportBuilder.timingsStats(originalImportReport.getTimingsStats()); } importReportBuilder.validationReport(validationReport); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java index 927c04736253..3aaafa746dd5 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/ParamsConverter.java @@ -28,12 +28,15 @@ package org.hisp.dhis.tracker.imports; import org.hisp.dhis.tracker.imports.bundle.TrackerBundle; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.user.User; /** * @author Luciano Fiandesio */ public class ParamsConverter { - public static TrackerBundle convert(TrackerImportParams params) { + public static TrackerBundle convert( + TrackerImportParams params, TrackerObjects trackerObjects, User user) { return TrackerBundle.builder() .importMode(params.getImportMode()) .importStrategy(params.getImportStrategy()) @@ -42,11 +45,11 @@ public static TrackerBundle convert(TrackerImportParams params) { .skipRuleEngine(params.isSkipRuleEngine()) .flushMode(params.getFlushMode()) .validationMode(params.getValidationMode()) - .trackedEntities(params.getTrackedEntities()) - .enrollments(params.getEnrollments()) - .events(params.getEvents()) - .relationships(params.getRelationships()) - .user(params.getUser()) + .trackedEntities(trackerObjects.getTrackedEntities()) + .enrollments(trackerObjects.getEnrollments()) + .events(trackerObjects.getEvents()) + .relationships(trackerObjects.getRelationships()) + .user(user) .build(); } } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java index cde712ce7863..161bc0bc8905 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParam.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import java.io.Serializable; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -50,7 +51,7 @@ // which is invalid. Drop @OpenApi.Property annotation after implementing support for the unpacking // of query param classes in OpenApiGenerator @OpenApi.Property(value = TrackerIdScheme.class) -public class TrackerIdSchemeParam { +public class TrackerIdSchemeParam implements Serializable { public static final TrackerIdSchemeParam UID = TrackerIdSchemeParam.of(TrackerIdScheme.UID, null); public static final TrackerIdSchemeParam CODE = diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java index 83760db26294..a2fb0826b1e5 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdSchemeParams.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -50,7 +51,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TrackerIdSchemeParams { +public class TrackerIdSchemeParams implements Serializable { /** Specific identifier to match data elements on. */ @JsonProperty @Builder.Default private TrackerIdSchemeParam dataElementIdScheme = TrackerIdSchemeParam.UID; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java index d64c2653dc04..7467d89bb261 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerIdentifierCollector.java @@ -53,6 +53,7 @@ import org.hisp.dhis.tracker.imports.domain.Note; import org.hisp.dhis.tracker.imports.domain.Relationship; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.springframework.stereotype.Component; /** @@ -70,12 +71,12 @@ public class TrackerIdentifierCollector { private final ProgramRuleService programRuleService; - public Map, Set> collect(TrackerImportParams params) { + public Map, Set> collect(TrackerObjects trackerObjects) { final Map, Set> identifiers = new HashMap<>(); - collectTrackedEntities(identifiers, params.getTrackedEntities()); - collectEnrollments(identifiers, params.getEnrollments()); - collectEvents(identifiers, params.getEvents()); - collectRelationships(identifiers, params.getRelationships()); + collectTrackedEntities(identifiers, trackerObjects.getTrackedEntities()); + collectEnrollments(identifiers, trackerObjects.getEnrollments()); + collectEvents(identifiers, trackerObjects.getEvents()); + collectRelationships(identifiers, trackerObjects.getRelationships()); collectProgramRulesFields(identifiers); return identifiers; } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java index df96cda1f128..6b5fc80f54fe 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportParams.java @@ -28,21 +28,12 @@ package org.hisp.dhis.tracker.imports; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobType; +import org.hisp.dhis.scheduling.JobParameters; import org.hisp.dhis.tracker.imports.bundle.TrackerBundleMode; -import org.hisp.dhis.tracker.imports.domain.Enrollment; -import org.hisp.dhis.tracker.imports.domain.Event; -import org.hisp.dhis.tracker.imports.domain.Relationship; -import org.hisp.dhis.tracker.imports.domain.TrackedEntity; -import org.hisp.dhis.user.User; /** * @author Morten Olav Hansen @@ -51,13 +42,10 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TrackerImportParams { +public class TrackerImportParams implements JobParameters { /** User uid to use for import job. */ @JsonProperty private String userId; - /** User to use for import job. */ - private User user; - /** Should import be imported or just validated. */ @JsonProperty @Builder.Default private final TrackerBundleMode importMode = TrackerBundleMode.COMMIT; @@ -91,50 +79,6 @@ public class TrackerImportParams { /** Name of file that was used for import (if available). */ @JsonProperty @Builder.Default private final String filename = null; - /** Job configuration */ - private JobConfiguration jobConfiguration; - @JsonProperty @Builder.Default private TrackerBundleReportMode reportMode = TrackerBundleReportMode.ERRORS; - - /** Tracked entities to import. */ - @JsonProperty @Builder.Default - private final List trackedEntities = new ArrayList<>(); - - /** Enrollments to import. */ - @JsonProperty @Builder.Default private final List enrollments = new ArrayList<>(); - - /** Events to import. */ - @JsonProperty @Builder.Default private final List events = new ArrayList<>(); - - /** Relationships to import. */ - @JsonProperty @Builder.Default private final List relationships = new ArrayList<>(); - - public TrackerImportParams setUser(User user) { - this.user = user; - - if (user != null) { - this.userId = user.getUid(); - } - - return this; - } - - @JsonProperty - public String getUsername() { - return User.username(user); - } - - @Override - public String toString() { - return Optional.ofNullable(this.getJobConfiguration()) - .map( - jobConfiguration -> - JobType.TRACKER_IMPORT_JOB + " ( " + jobConfiguration.getUid() + " )") - .orElse(JobType.TRACKER_IMPORT_JOB.toString()); - } - - public String userStartInfo() { - return this + " started by " + this.getUsername() + " ( " + this.userId + " )"; - } } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java index 23d3222af8cc..caa72a9b64f8 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/TrackerImportService.java @@ -27,6 +27,9 @@ */ package org.hisp.dhis.tracker.imports; +import org.hisp.dhis.scheduling.JobProgress; +import org.hisp.dhis.scheduling.NoopJobProgress; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; /** @@ -37,10 +40,25 @@ public interface TrackerImportService { * Import object using provided params. Takes the objects through all phases of the importer from * preheating to validation, and then finished with a commit (unless its validate only) * - * @param params Parameters for import, including objects + * @param params Parameters for import + * @param trackerObjects the objects to import * @return Report giving status of import (and any errors) */ - ImportReport importTracker(TrackerImportParams params); + default ImportReport importTracker(TrackerImportParams params, TrackerObjects trackerObjects) { + return importTracker(params, trackerObjects, NoopJobProgress.INSTANCE); + } + + /** + * Import object using provided params. Takes the objects through all phases of the importer from + * preheating to validation, and then finished with a commit (unless its validate only) + * + * @param params Parameters for import + * @param trackerObjects the objects to import + * @param jobProgress to track import progress + * @return Report giving status of import (and any errors) + */ + ImportReport importTracker( + TrackerImportParams params, TrackerObjects trackerObjects, JobProgress jobProgress); /** * Build the report based on the mode selected by the client. diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java index 0374ea7aa1b7..a8699eadad70 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/DefaultTrackerBundleService.java @@ -41,6 +41,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.bundle.persister.CommitService; import org.hisp.dhis.tracker.imports.bundle.persister.TrackerObjectDeletionService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.job.TrackerSideEffectDataBundle; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheatService; @@ -48,6 +49,7 @@ import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.report.TrackerTypeReport; import org.hisp.dhis.tracker.imports.sideeffect.SideEffectHandlerService; +import org.hisp.dhis.user.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -78,9 +80,11 @@ public void setSideEffectHandlers(List sideEffectHandl } @Override - public TrackerBundle create(TrackerImportParams params) { - TrackerBundle trackerBundle = ParamsConverter.convert(params); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + public TrackerBundle create( + TrackerImportParams params, TrackerObjects trackerObjects, User user) { + TrackerBundle trackerBundle = ParamsConverter.convert(params, trackerObjects, user); + TrackerPreheat preheat = + trackerPreheatService.preheat(trackerObjects, params.getIdSchemes(), user); trackerBundle.setPreheat(preheat); return trackerBundle; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java index af8e46e72472..cdb50aee5cda 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleService.java @@ -29,8 +29,10 @@ import java.util.List; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.job.TrackerSideEffectDataBundle; import org.hisp.dhis.tracker.imports.report.PersistenceReport; +import org.hisp.dhis.user.User; /** * @author Morten Olav Hansen @@ -42,7 +44,7 @@ public interface TrackerBundleService { * @param params Params object for this bundle. * @return Configured TrackerBundle instance(s) (if bundle splitting is enabled) */ - TrackerBundle create(TrackerImportParams params); + TrackerBundle create(TrackerImportParams params, TrackerObjects trackerObjects, User user); /** * Call rule engine for tracker bundle. diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java index be0ccf18d421..37134c2f6bff 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Attribute.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -42,7 +43,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Attribute { +public class Attribute implements Serializable { @JsonProperty private MetadataIdentifier attribute; @JsonProperty private String code; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java index 567290315e17..b00612269568 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Coordinate.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -41,7 +42,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Coordinate { +public class Coordinate implements Serializable { @JsonProperty private Double latitude; @JsonProperty private Double longitude; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java index fd1e6689c491..d0b0a7de9f93 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/DataValue.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -41,7 +42,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class DataValue { +public class DataValue implements Serializable { @JsonProperty private Instant createdAt; @JsonProperty private Instant updatedAt; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java index d5ec22ed7d47..0e702d9bbf81 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Enrollment.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -45,7 +46,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Enrollment implements TrackerDto { +public class Enrollment implements TrackerDto, Serializable { @JsonProperty private String enrollment; @JsonProperty private Instant createdAt; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java index 4b30f68fb4c1..5298abab4e03 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Event.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.HashSet; @@ -49,7 +50,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Event implements TrackerDto { +public class Event implements TrackerDto, Serializable { @JsonProperty private String event; @JsonProperty @Builder.Default private EventStatus status = EventStatus.ACTIVE; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java index 3b28029e61b4..3ad1b265787b 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/MetadataIdentifier.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.util.Objects; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -57,7 +58,7 @@ */ @Value @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class MetadataIdentifier { +public class MetadataIdentifier implements Serializable { public static final MetadataIdentifier EMPTY_UID = MetadataIdentifier.ofUid((String) null); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java index cec45da897d7..5401ed822ccc 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Note.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -44,7 +45,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Note { +public class Note implements Serializable { @JsonProperty private String note; @JsonProperty private Instant storedAt; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java index 5219571ab623..83beb87b27a5 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/Relationship.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import lombok.AllArgsConstructor; import lombok.Builder; @@ -42,7 +43,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class Relationship implements TrackerDto { +public class Relationship implements TrackerDto, Serializable { @JsonProperty private String relationship; @JsonProperty private String relationshipName; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java index 12e022a460ae..cc80e0be0337 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/RelationshipItem.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -40,7 +41,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class RelationshipItem { +public class RelationshipItem implements Serializable { @JsonProperty private String trackedEntity; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java index 7aee6fba58e9..29eaf07e3f9d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackedEntity.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -45,7 +46,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TrackedEntity implements TrackerDto { +public class TrackedEntity implements TrackerDto, Serializable { @JsonProperty private String trackedEntity; @JsonProperty private MetadataIdentifier trackedEntityType; diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java similarity index 63% rename from dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java rename to dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java index c48ae7a81316..02a8a89dba76 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerSyncImporter.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/TrackerObjects.java @@ -25,27 +25,30 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.hisp.dhis.webapi.controller.tracker.imports; +package org.hisp.dhis.tracker.imports.domain; -import javax.annotation.Nonnull; -import lombok.RequiredArgsConstructor; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.report.ImportReport; -import org.springframework.stereotype.Component; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; -/** - * @author Luca Cambi - */ -@Component -@RequiredArgsConstructor -public class TrackerSyncImporter { - - @Nonnull private final TrackerImportService trackerImportService; - - public ImportReport importTracker(TrackerImportParams params) { - ImportReport importReport = trackerImportService.importTracker(params); +@Getter +@ToString +@EqualsAndHashCode +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TrackerObjects implements Serializable { + @JsonProperty @Builder.Default + private final List trackedEntities = new ArrayList<>(); - return trackerImportService.buildImportReport(importReport, params.getReportMode()); - } + @JsonProperty @Builder.Default private final List enrollments = new ArrayList<>(); + @JsonProperty @Builder.Default private final List events = new ArrayList<>(); + @JsonProperty @Builder.Default private final List relationships = new ArrayList<>(); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java index d30e8891540e..0509c17bad16 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/domain/User.java @@ -30,6 +30,7 @@ import static org.apache.commons.lang3.StringUtils.isBlank; import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -42,7 +43,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class User { +public class User implements Serializable { @JsonProperty private String uid; @JsonProperty private String username; diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java deleted file mode 100644 index cb2796a2cb23..000000000000 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerImportThread.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.tracker.imports.job; - -import org.hisp.dhis.security.SecurityContextRunnable; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; -import org.springframework.util.Assert; - -/** - * @author Morten Olav Hansen - */ -@Component -@Scope(BeanDefinition.SCOPE_PROTOTYPE) -public class TrackerImportThread extends SecurityContextRunnable { - private final TrackerImportService trackerImportService; - - private TrackerImportParams trackerImportParams; - - public TrackerImportThread(TrackerImportService trackerImportService) { - this.trackerImportService = trackerImportService; - } - - @Override - public void call() { - Assert.notNull(trackerImportParams, "Field trackerImportParams can not be null. "); - - trackerImportService.importTracker(trackerImportParams); // discard returned report - } - - public void setTrackerImportParams(TrackerImportParams trackerImportParams) { - this.trackerImportParams = trackerImportParams; - } -} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java deleted file mode 100644 index ab8bcb5ceaab..000000000000 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessage.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.tracker.imports.job; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -import lombok.Builder; -import lombok.Value; -import org.hisp.dhis.artemis.MessageType; -import org.hisp.dhis.artemis.SerializableMessage; -import org.hisp.dhis.tracker.imports.TrackerImportParams; - -/** - * Used by Apache Artemis to pass tracker import jobs from the /api/tracker endpoint to the tracker - * import services. - * - * @author Morten Olav Hansen - */ -@Value -@Builder(builderClassName = "TrackerMessageBuilder") -@JsonDeserialize(builder = TrackerMessage.TrackerMessageBuilder.class) -public class TrackerMessage implements SerializableMessage { - @JsonProperty private final String uid; - - @JsonProperty private final String authentication; - - @JsonProperty private final TrackerImportParams trackerImportParams; - - @Override - public MessageType getMessageType() { - return MessageType.TRACKER_JOB; - } - - @JsonPOJOBuilder(withPrefix = "") - public static final class TrackerMessageBuilder {} -} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java deleted file mode 100644 index ef8d8abfbef7..000000000000 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerMessageManager.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.tracker.imports.job; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import javax.jms.JMSException; -import javax.jms.TextMessage; -import org.hisp.dhis.artemis.Topics; -import org.hisp.dhis.common.AsyncTaskExecutor; -import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobType; -import org.hisp.dhis.security.AuthenticationSerializer; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.springframework.beans.factory.ObjectFactory; -import org.springframework.jms.annotation.JmsListener; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; - -/** - * @author Morten Olav Hansen - */ -@Component -public class TrackerMessageManager { - private final ObjectMapper objectMapper; - - private final AsyncTaskExecutor taskExecutor; - - private final ObjectFactory trackerImportThreadFactory; - - public TrackerMessageManager( - ObjectMapper objectMapper, - AsyncTaskExecutor taskExecutor, - ObjectFactory trackerImportThreadFactory) { - this.objectMapper = objectMapper; - this.taskExecutor = taskExecutor; - this.trackerImportThreadFactory = trackerImportThreadFactory; - } - - @JmsListener( - destination = Topics.TRACKER_IMPORT_JOB_TOPIC_NAME, - containerFactory = "jmsQueueListenerContainerFactory") - public void consume(TextMessage message) throws JMSException, JsonProcessingException { - String payload = message.getText(); - - TrackerMessage trackerMessage = objectMapper.readValue(payload, TrackerMessage.class); - TrackerImportParams trackerImportParams = trackerMessage.getTrackerImportParams(); - - JobConfiguration jobConfiguration = - new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, trackerImportParams.getUserId()); - - jobConfiguration.setUid(trackerMessage.getUid()); - trackerImportParams.setJobConfiguration(jobConfiguration); - - TrackerImportThread trackerImportThread = trackerImportThreadFactory.getObject(); - trackerImportThread.setTrackerImportParams(trackerImportParams); - - SecurityContextHolder.getContext() - .setAuthentication( - AuthenticationSerializer.deserialize(trackerMessage.getAuthentication())); - - taskExecutor.executeTask(trackerImportThread); - } -} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java index 3051680314c2..c2de4078f69d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatService.java @@ -36,8 +36,10 @@ import lombok.extern.slf4j.Slf4j; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.preheat.PreheatException; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.supplier.PreheatSupplier; +import org.hisp.dhis.user.User; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; @@ -70,17 +72,18 @@ public void setApplicationContext(ApplicationContext applicationContext) throws @Override @Transactional(readOnly = true) - public TrackerPreheat preheat(TrackerImportParams params) { + public TrackerPreheat preheat( + TrackerObjects trackerObjects, TrackerIdSchemeParams idSchemeParams, User user) { TrackerPreheat preheat = new TrackerPreheat(); - preheat.setIdSchemes(params.getIdSchemes()); - preheat.setUser(params.getUser()); + preheat.setIdSchemes(idSchemeParams); + preheat.setUser(user); checkNotNull(preheat.getUser(), "TrackerPreheat is missing the user object."); for (String supplier : preheatSuppliers) { final String beanName = Introspector.decapitalize(supplier); try { - ctx.getBean(beanName, PreheatSupplier.class).add(params, preheat); + ctx.getBean(beanName, PreheatSupplier.class).add(trackerObjects, preheat); } catch (BeansException beanException) { processException( "Unable to find a preheat supplier with name " diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java index 83425bab3a07..05b97823a1ca 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatService.java @@ -27,7 +27,9 @@ */ package org.hisp.dhis.tracker.imports.preheat; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.user.User; /** * @author Morten Olav Hansen @@ -39,5 +41,6 @@ public interface TrackerPreheatService { * * @param params Params for preheating */ - TrackerPreheat preheat(TrackerImportParams params); + TrackerPreheat preheat( + TrackerObjects trackerObjects, TrackerIdSchemeParams idSchemeParams, User user); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java index 0b344e8e4d82..8a7d1958a208 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/AbstractPreheatSupplier.java @@ -33,7 +33,7 @@ import org.apache.commons.lang3.time.StopWatch; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.hibernate.HibernateProxyUtils; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; @@ -50,7 +50,7 @@ public abstract class AbstractPreheatSupplier implements PreheatSupplier { private final long CACHE_CAPACITY = 1000; @Override - public void add(TrackerImportParams params, TrackerPreheat preheat) { + public void add(TrackerObjects trackerObjects, TrackerPreheat preheat) { StopWatch watch = null; if (log.isDebugEnabled()) { log.debug("Executing preheat supplier: {}", this.getClass().getName()); @@ -58,7 +58,7 @@ public void add(TrackerImportParams params, TrackerPreheat preheat) { watch.start(); } - preheatAdd(params, preheat); + preheatAdd(trackerObjects, preheat); if (log.isDebugEnabled()) { if (watch != null && watch.isStarted()) { @@ -72,7 +72,7 @@ public void add(TrackerImportParams params, TrackerPreheat preheat) { } /** Template method: executes preheat logic from the subclass */ - public abstract void preheatAdd(TrackerImportParams params, TrackerPreheat preheat); + public abstract void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat); protected void addToCache(PreheatCacheService cache, List objects) { objects.forEach( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java index 831441c6dc90..93c256b92412 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplier.java @@ -35,7 +35,7 @@ import java.util.Set; import lombok.RequiredArgsConstructor; import org.hisp.dhis.tracker.imports.TrackerIdentifierCollector; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.ClassBasedSupplierStrategy; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.GenericStrategy; @@ -67,13 +67,13 @@ public class ClassBasedSupplier extends AbstractPreheatSupplier implements Appli private final Map classStrategies; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { /* * Collects all references from the payload and create a Map where key * is the reference type (e.g. Enrollment) and the value is a Set of * identifiers (e.g. a list of all Enrollment UIDs found in the payload) */ - Map, Set> identifierMap = identifierCollector.collect(params); + Map, Set> identifierMap = identifierCollector.collect(trackerObjects); identifierMap.forEach( (key, identifiers) -> { @@ -90,7 +90,7 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { } else { context .getBean(Introspector.decapitalize(bean), ClassBasedSupplierStrategy.class) - .add(params, splitList, preheat); + .add(splitList, preheat); } }); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java index bf12d2c46db3..7db809ab2c3c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DefaultsSupplier.java @@ -36,7 +36,7 @@ import org.hisp.dhis.category.CategoryOptionCombo; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; import org.hisp.dhis.tracker.imports.preheat.mappers.CategoryComboMapper; @@ -59,7 +59,7 @@ public class DefaultsSupplier extends AbstractPreheatSupplier { @Nonnull private final PreheatCacheService cache; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { // not using manager.getDefaults() as the collections of the entities // are still hibernate proxies // this leads to lazy init exceptions with - no session. reason is the diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java index a91c405021ba..89ec6171e11c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplier.java @@ -34,8 +34,8 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.relationship.RelationshipStore; import org.hisp.dhis.relationship.RelationshipType; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Relationship; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.RelationshipMapper; import org.hisp.dhis.tracker.imports.util.RelationshipKeySupport; @@ -47,9 +47,9 @@ public class DuplicateRelationshipSupplier extends AbstractPreheatSupplier { @Nonnull private final RelationshipStore relationshipStore; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List relationships = - retrieveRelationshipKeys(params.getRelationships(), preheat); + retrieveRelationshipKeys(trackerObjects.getRelationships(), preheat); relationships.stream() .map(RelationshipMapper.INSTANCE::map) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java index f8c9338257d0..e26b40d99e51 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplier.java @@ -36,7 +36,7 @@ import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStore; import org.hisp.dhis.program.ProgramType; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.EnrollmentMapper; import org.springframework.stereotype.Component; @@ -52,7 +52,7 @@ public class EnrollmentSupplier extends AbstractPreheatSupplier { @Nonnull private final ProgramStore programStore; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List programsWithoutRegistration = preheat.getAll(Program.class).stream() .filter(program -> program.getProgramType().equals(ProgramType.WITHOUT_REGISTRATION)) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java index 4a0190c49171..f3981a09d4d5 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentsWithAtLeastOneEventSupplier.java @@ -33,7 +33,7 @@ import java.util.stream.Collectors; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.program.Enrollment; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -64,7 +64,7 @@ protected EnrollmentsWithAtLeastOneEventSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { final Map enrollments = preheat.getEnrollments(); List programStageIds = enrollments.values().stream().map(IdentifiableObject::getId).collect(Collectors.toList()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java index 2409d9c2a61d..8d3ce4dd9221 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplier.java @@ -40,9 +40,9 @@ import org.hisp.dhis.category.CategoryService; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.CategoryOptionComboMapper; import org.springframework.stereotype.Component; @@ -63,10 +63,10 @@ public class EventCategoryOptionComboSupplier extends AbstractPreheatSupplier { @Nonnull private final CategoryService categoryService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List>> events = - params.getEvents().stream() + trackerObjects.getEvents().stream() .filter( e -> e.getAttributeOptionCombo().isBlank() diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java index bdf845453377..fa1a2128754d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventProgramStageMapSupplier.java @@ -31,8 +31,8 @@ import java.util.Objects; import java.util.stream.Collectors; import org.hisp.dhis.program.ProgramStage; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; @@ -72,13 +72,13 @@ protected EventProgramStageMapSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { - if (params.getEvents().isEmpty()) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + if (trackerObjects.getEvents().isEmpty()) { return; } List notRepeatableProgramStageUids = - params.getEvents().stream() + trackerObjects.getEvents().stream() .map(Event::getProgramStage) .filter(Objects::nonNull) .map(preheat::getProgramStage) @@ -90,7 +90,7 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { .collect(Collectors.toList()); List enrollmentUids = - params.getEvents().stream() + trackerObjects.getEvents().stream() .map(Event::getEnrollment) .filter(Objects::nonNull) .distinct() diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java index 6a0cc39b88cd..186716c87d47 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplier.java @@ -39,10 +39,10 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.stereotype.Component; @@ -55,9 +55,8 @@ public class FileResourceSupplier extends AbstractPreheatSupplier { @Nonnull private final FileResourceService fileResourceService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { - TrackerIdSchemeParams idSchemes = params.getIdSchemes(); - + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { + TrackerIdSchemeParams idSchemes = preheat.getIdSchemes(); List fileResourceAttributes = preheat.getAll(TrackedEntityAttribute.class).stream() .filter(at -> at.getValueType().isFile()) @@ -71,15 +70,15 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { .collect(Collectors.toList()); List fileResourceIds = new ArrayList<>(); - params + trackerObjects .getTrackedEntities() .forEach( te -> collectResourceIds(fileResourceAttributes, fileResourceIds, te.getAttributes())); - params + trackerObjects .getEnrollments() .forEach( en -> collectResourceIds(fileResourceAttributes, fileResourceIds, en.getAttributes())); - params + trackerObjects .getEvents() .forEach( en -> diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java index ef817a04a2da..9918e4f6bdf6 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplier.java @@ -41,10 +41,10 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.stereotype.Component; @@ -57,7 +57,7 @@ public class OrgUnitValueTypeSupplier extends AbstractPreheatSupplier { @Nonnull private final IdentifiableObjectManager manager; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { TrackerIdSchemeParams idSchemes = preheat.getIdSchemes(); List orgUnitAttributes = @@ -73,13 +73,13 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { .collect(Collectors.toList()); List orgUnitIds = new ArrayList<>(); - params + trackerObjects .getTrackedEntities() .forEach(te -> collectResourceIds(orgUnitAttributes, orgUnitIds, te.getAttributes())); - params + trackerObjects .getEnrollments() .forEach(en -> collectResourceIds(orgUnitAttributes, orgUnitIds, en.getAttributes())); - params + trackerObjects .getEvents() .forEach(ev -> collectResourceIds(orgUnitDataElements, orgUnitIds, ev.getDataValues())); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java index a9d832164f76..94ae63808d93 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplier.java @@ -35,7 +35,7 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodStore; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; import org.springframework.stereotype.Component; @@ -51,7 +51,7 @@ public class PeriodTypeSupplier extends AbstractPreheatSupplier { @Nonnull private final PreheatCacheService cache; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { if (cache.hasKey(Period.class.getName())) { preheat.put(TrackerIdSchemeParam.UID, cache.getAll(Period.class.getName())); } else { diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java index f57986b87bad..231addb5deb3 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/PreheatSupplier.java @@ -28,6 +28,7 @@ package org.hisp.dhis.tracker.imports.preheat.supplier; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; /** @@ -39,8 +40,8 @@ public interface PreheatSupplier { /** * Adds data to the {@link TrackerPreheat} using the supplied {@link TrackerImportParams} * - * @param params {@link TrackerImportParams} + * @param trackerObjects {@link TrackerObjects} * @param preheat {@link TrackerPreheat} */ - void add(TrackerImportParams params, TrackerPreheat preheat); + void add(TrackerObjects trackerObjects, TrackerPreheat preheat); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java index e44c6459bf5b..ee4b26b85a5b 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOrgUnitsSupplier.java @@ -31,7 +31,7 @@ import java.util.stream.Collectors; import org.hisp.dhis.common.IdentifiableObject; import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -55,7 +55,7 @@ protected ProgramOrgUnitsSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { // fetch all existing Org Units from payload final List orgUnitIds = preheat.getAll(OrganisationUnit.class).stream() diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java index 7dcd04847c3f..87c909951e01 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/ProgramOwnerSupplier.java @@ -38,8 +38,8 @@ import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityProgramOwnerOrgUnit; import org.hisp.dhis.trackedentity.TrackedEntityProgramOwnerStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.OrganisationUnitMapper; import org.springframework.stereotype.Component; @@ -53,18 +53,18 @@ public class ProgramOwnerSupplier extends AbstractPreheatSupplier { @Nonnull private final TrackedEntityProgramOwnerStore trackedEntityProgramOwnerStore; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { final Map preheatedTrackedEntities = preheat.getTrackedEntities(); final Map preheatedEnrollments = preheat.getEnrollments(); Set teIds = new HashSet<>(); - for (org.hisp.dhis.tracker.imports.domain.Enrollment en : params.getEnrollments()) { + for (org.hisp.dhis.tracker.imports.domain.Enrollment en : trackerObjects.getEnrollments()) { TrackedEntity te = preheatedTrackedEntities.get(en.getTrackedEntity()); if (te != null) { teIds.add(te.getId()); } } - for (Event ev : params.getEvents()) { + for (Event ev : trackerObjects.getEvents()) { Enrollment enrollment = preheatedEnrollments.get(ev.getEnrollment()); if (enrollment != null && enrollment.getTrackedEntity() != null) { teIds.add(enrollment.getTrackedEntity().getId()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java index 3b075fed7f1e..9072523a59e1 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/TrackedEntityEnrollmentSupplier.java @@ -37,7 +37,7 @@ import org.hisp.dhis.program.Enrollment; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStatus; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.util.Constant; import org.springframework.jdbc.core.JdbcTemplate; @@ -97,9 +97,9 @@ protected TrackedEntityEnrollmentSupplier(JdbcTemplate jdbcTemplate) { } @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List trackedEntityList = - params.getEnrollments().stream() + trackerObjects.getEnrollments().stream() .map(org.hisp.dhis.tracker.imports.domain.Enrollment::getTrackedEntity) .collect(Collectors.toList()); @@ -115,7 +115,7 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { Map> trackedEntityToEnrollmentMap = new HashMap<>(); - if (params.getEnrollments().isEmpty()) return; + if (trackerObjects.getEnrollments().isEmpty()) return; for (List trackedEntityListSubList : trackedEntities) { queryTeiAndAddToMap(trackedEntityToEnrollmentMap, trackedEntityListSubList, programList); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java index 598a38bc0d74..353bb1888b91 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributesSupplier.java @@ -52,9 +52,9 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.UniqueAttributeValue; import org.springframework.stereotype.Component; @@ -74,20 +74,20 @@ public class UniqueAttributesSupplier extends AbstractPreheatSupplier { @Nonnull private final TrackedEntityAttributeValueService trackedEntityAttributeValueService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List uniqueTrackedEntityAttributes = trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes(); Map> allUniqueAttributesByTrackedEntity = - getAllAttributesByTrackedEntity(params, preheat, uniqueTrackedEntityAttributes); + getAllAttributesByTrackedEntity(trackerObjects, preheat, uniqueTrackedEntityAttributes); List uniqueAttributeValuesFromPayload = getDuplicatedUniqueValuesInPayload(allUniqueAttributesByTrackedEntity); List uniqueAttributeValuesFromDB = getAlreadyPresentInDbUniqueValues( - params.getIdSchemes(), + preheat.getIdSchemes(), allUniqueAttributesByTrackedEntity, uniqueTrackedEntityAttributes); @@ -102,11 +102,11 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { private Map> getAllAttributesByTrackedEntity( - TrackerImportParams params, + TrackerObjects trackerObjects, TrackerPreheat preheat, List uniqueTrackedEntityAttributes) { Map> teUniqueAttributes = - params.getTrackedEntities().stream() + trackerObjects.getTrackedEntities().stream() .collect( toMap( Function.identity(), @@ -115,9 +115,10 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { Map> enrollmentUniqueAttributes = - params.getEnrollments().stream() + trackerObjects.getEnrollments().stream() .collect( - groupingBy(e -> getEntityForEnrollment(params, preheat, e.getTrackedEntity()))) + groupingBy( + e -> getEntityForEnrollment(trackerObjects, preheat, e.getTrackedEntity()))) .entrySet() .stream() .collect( @@ -136,12 +137,12 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { } private org.hisp.dhis.tracker.imports.domain.TrackedEntity getEntityForEnrollment( - TrackerImportParams params, TrackerPreheat preheat, String teUid) { + TrackerObjects trackerObjects, TrackerPreheat preheat, String teUid) { TrackedEntity trackedEntity = preheat.getTrackedEntity(teUid); // Get te from Preheat Optional optionalTe = - params.getTrackedEntities().stream() + trackerObjects.getTrackedEntities().stream() .filter(te -> Objects.equals(te.getTrackedEntity(), teUid)) .findAny(); if (optionalTe.isPresent()) { @@ -152,7 +153,7 @@ private org.hisp.dhis.tracker.imports.domain.TrackedEntity getEntityForEnrollmen new org.hisp.dhis.tracker.imports.domain.TrackedEntity(); te.setTrackedEntity(teUid); te.setOrgUnit( - params.getIdSchemes().toMetadataIdentifier(trackedEntity.getOrganisationUnit())); + preheat.getIdSchemes().toMetadataIdentifier(trackedEntity.getOrganisationUnit())); return te; } else // TE is not present. but we do not fail here. // A validation error will be thrown in validation phase diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java index 0f119ea5a100..ff98ac18a259 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplier.java @@ -37,8 +37,8 @@ import org.apache.commons.lang3.StringUtils; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.domain.User; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.UserMapper; @@ -56,9 +56,9 @@ public class UserSupplier extends AbstractPreheatSupplier { @Nonnull private final UserService userService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { Set userUids = - params.getEvents().stream() + trackerObjects.getEvents().stream() .filter(Objects::nonNull) .map(Event::getAssignedUser) .filter(Objects::nonNull) @@ -67,7 +67,7 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { .collect(Collectors.toSet()); Set usernames = - params.getEvents().stream() + trackerObjects.getEvents().stream() .filter(Objects::nonNull) .map(Event::getAssignedUser) .filter(Objects::nonNull) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java index 0702e56f7c44..a2523c34631c 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/UsernameValueTypeSupplier.java @@ -37,9 +37,9 @@ import org.hisp.dhis.common.ValueType; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.UserMapper; import org.hisp.dhis.user.User; @@ -56,7 +56,7 @@ public class UsernameValueTypeSupplier extends AbstractPreheatSupplier { @Nonnull private final UserService userService; @Override - public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { + public void preheatAdd(TrackerObjects trackerObjects, TrackerPreheat preheat) { List attributes = preheat.getAll(TrackedEntityAttribute.class); TrackerIdSchemeParams idSchemes = preheat.getIdSchemes(); @@ -68,10 +68,10 @@ public void preheatAdd(TrackerImportParams params, TrackerPreheat preheat) { List usernames = new ArrayList<>(); - params + trackerObjects .getTrackedEntities() .forEach(te -> collectResourceIds(usernameAttributes, usernames, te.getAttributes())); - params + trackerObjects .getEnrollments() .forEach(en -> collectResourceIds(usernameAttributes, usernames, en.getAttributes())); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java index da4e957a096e..b33812b83b40 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/AbstractSchemaStrategy.java @@ -44,7 +44,6 @@ import org.hisp.dhis.schema.SchemaService; import org.hisp.dhis.tracker.imports.TrackerIdScheme; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; import org.hisp.dhis.tracker.imports.preheat.mappers.CopyMapper; @@ -79,9 +78,8 @@ protected AbstractSchemaStrategy( } @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { - TrackerIdSchemeParam idSchemeParam = params.getIdSchemes().getByClass(getSchemaClass()); + public void add(List> splitList, TrackerPreheat preheat) { + TrackerIdSchemeParam idSchemeParam = preheat.getIdSchemes().getByClass(getSchemaClass()); Schema schema = schemaService.getDynamicSchema(getSchemaClass()); queryForIdentifiableObjects(preheat, schema, idSchemeParam, splitList, mapper()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java index 3bdff20cc475..9b6811151a03 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/ClassBasedSupplierStrategy.java @@ -28,12 +28,11 @@ package org.hisp.dhis.tracker.imports.preheat.supplier.strategy; import java.util.List; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; /** * @author Luciano Fiandesio */ public interface ClassBasedSupplierStrategy { - void add(TrackerImportParams params, List> splitList, TrackerPreheat preheat); + void add(List> splitList, TrackerPreheat preheat); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java index 2875cba5ee7d..03e8ea052440 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EnrollmentStrategy.java @@ -32,7 +32,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.program.Enrollment; import org.hisp.dhis.program.EnrollmentStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.EnrollmentMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -50,8 +49,7 @@ public class EnrollmentStrategy implements ClassBasedSupplierStrategy { @Nonnull private final EnrollmentStore enrollmentStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { for (List ids : splitList) { List enrollments = enrollmentStore.getIncludingDeleted(ids); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java index 5148447256d4..aceb75b5833d 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/EventStrategy.java @@ -32,7 +32,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.program.Event; import org.hisp.dhis.program.EventStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.EventMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -48,8 +47,7 @@ public class EventStrategy implements ClassBasedSupplierStrategy { @Nonnull private final EventStore eventStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { for (List ids : splitList) { List events = eventStore.getIncludingDeleted(ids); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java index f0d7f3d971db..0b6fdcd25595 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/NoteStrategy.java @@ -32,7 +32,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.note.Note; import org.hisp.dhis.note.NoteStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.NoteMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -48,8 +47,7 @@ public class NoteStrategy implements ClassBasedSupplierStrategy { @Nonnull private final NoteStore noteStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { splitList.forEach( ids -> preheat.putNotes( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java index 20902c26b09f..b44a38149515 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/RelationshipStrategy.java @@ -33,7 +33,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.relationship.RelationshipStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Relationship; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.RelationshipMapper; @@ -50,8 +49,7 @@ public class RelationshipStrategy implements ClassBasedSupplierStrategy { @Nonnull private final RelationshipStore relationshipStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { List relationships = retrieveRelationships(splitList); preheat.putRelationships( diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java index 27f29f913215..182f8645c2cc 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategy.java @@ -32,7 +32,6 @@ import lombok.RequiredArgsConstructor; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.mappers.TrackedEntityMapper; import org.hisp.dhis.tracker.imports.preheat.supplier.DetachUtils; @@ -50,8 +49,7 @@ public class TrackerEntityStrategy implements ClassBasedSupplierStrategy { @Nonnull private TrackedEntityStore trackedEntityStore; @Override - public void add( - TrackerImportParams params, List> splitList, TrackerPreheat preheat) { + public void add(List> splitList, TrackerPreheat preheat) { for (List ids : splitList) { // Fetch all Tracked Entity present in the payload List trackedEntities = trackedEntityStore.getIncludingDeleted(ids); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java index d9545c36e13a..15670984a5de 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/ImportReport.java @@ -75,9 +75,6 @@ public class ImportReport { */ @JsonProperty Stats stats; - /** A report object containing the elapsed time for each Import stage */ - @JsonProperty TimingsStats timingsStats; - /** A report containing the outcome of the commit stage (e.g. how many entities were persisted) */ @JsonProperty("bundleReport") PersistenceReport persistenceReport; @@ -96,15 +93,13 @@ public class ImportReport { * therefore all bundle objects were ignored. * * @param validationReport The validation report - * @param timingsStats The timing stats * @param bundleSize The sum of all bundle objects */ public static ImportReport withValidationErrors( - ValidationReport validationReport, TimingsStats timingsStats, int bundleSize) { + ValidationReport validationReport, int bundleSize) { return builder() .status(Status.ERROR) .validationReport(validationReport) - .timingsStats(timingsStats) .stats(Stats.builder().ignored(bundleSize).build()) .build(); } @@ -119,15 +114,12 @@ public static ImportReport withValidationErrors( * * @param message The error message * @param validationReport The validation report if available - * @param timingsStats The timing stats if available */ - public static ImportReport withError( - String message, ValidationReport validationReport, TimingsStats timingsStats) { + public static ImportReport withError(String message, ValidationReport validationReport) { // TODO shall we calculate stats in this case? return builder() .status(Status.ERROR) .validationReport(validationReport) - .timingsStats(timingsStats) .message(message) .build(); } @@ -142,7 +134,6 @@ public static ImportReport withError( * @param persistenceReport The report containing how many bundle objects were successfully * persisted * @param validationReport The validation report if available - * @param timingsStats The timing stats if available * @param bundleSize a map containing the size of each entity type in the Bundle - before the * validation */ @@ -150,7 +141,6 @@ public static ImportReport withImportCompleted( Status status, PersistenceReport persistenceReport, ValidationReport validationReport, - TimingsStats timingsStats, Map bundleSize) { Stats stats = Stats.builder().build(); Stats brs = persistenceReport.getStats(); @@ -159,7 +149,6 @@ public static ImportReport withImportCompleted( return builder() .status(status) .validationReport(validationReport) - .timingsStats(timingsStats) .persistenceReport(processBundleReport(persistenceReport, bundleSize)) .stats(stats) .build(); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java b/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java deleted file mode 100644 index 594ac149f333..000000000000 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/report/TimingsStats.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.tracker.imports.report; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.function.Supplier; -import lombok.Data; -import org.hisp.dhis.commons.timer.SystemTimer; -import org.hisp.dhis.commons.timer.Timer; - -/** - * This report keeps track of the elapsed time for each stage of the validation process. - * - * @author Luciano Fiandesio - */ -@Data -public class TimingsStats { - public static final String PREHEAT_OPS = "preheat"; - - public static final String PREPROCESS_OPS = "preprocess"; - - public static final String COMMIT_OPS = "commit"; - - public static final String VALIDATION_OPS = "validation"; - - public static final String PROGRAMRULE_OPS = "programrule"; - - public static final String VALIDATE_PROGRAMRULE_OPS = "programruleValidation"; - - public static final String TOTAL_OPS = "totalImport"; - - public static final String PREPARE_REQUEST_OPS = "prepareRequest"; - - public static final String TOTAL_REQUEST_OPS = "totalRequest"; - - @JsonProperty private Map timers = new LinkedHashMap<>(); - - private static final String DEFAULT_VALUE = "0.0 sec."; - - public String getPrepareRequest() { - return timers.getOrDefault(PREPARE_REQUEST_OPS, DEFAULT_VALUE); - } - - public String getValidation() { - return timers.getOrDefault(VALIDATION_OPS, DEFAULT_VALUE); - } - - public String getCommit() { - return timers.getOrDefault(COMMIT_OPS, DEFAULT_VALUE); - } - - public String getPreheat() { - return timers.getOrDefault(PREHEAT_OPS, DEFAULT_VALUE); - } - - public String getProgramRule() { - return timers.getOrDefault(PROGRAMRULE_OPS, DEFAULT_VALUE); - } - - public String getTotalImport() { - return timers.getOrDefault(TOTAL_OPS, DEFAULT_VALUE); - } - - public String getTotalRequest() { - - return timers.getOrDefault(TOTAL_REQUEST_OPS, DEFAULT_VALUE); - } - - @JsonIgnore private Timer totalTimer; - - public TimingsStats() { - totalTimer = new SystemTimer().start(); - } - - public void set(String timedOperation, String elapsed) { - this.timers.put(timedOperation, elapsed); - } - - /** - * Executes the given Supplier and measure the elapsed time. - * - * @param timedOperation the operation name to place in the timers map - * @param supplier ths Supplier to execute - * @return the result of the Supplier invocation - */ - public T exec(String timedOperation, Supplier supplier) { - Timer timer = new SystemTimer().start(); - - T result = supplier.get(); - - timer.stop(); - - this.set(timedOperation, timer.toString()); - - return result; - } - - /** - * Executes the given operation. - * - * @param timedOperation the operation name to place in the timers map - * @param runnable the operation to execute - */ - public void execVoid(String timedOperation, Runnable runnable) { - Timer timer = new SystemTimer().start(); - - runnable.run(); - - timer.stop(); - - this.set(timedOperation, timer.toString()); - } - - public TimingsStats stopTimer() { - if (totalTimer != null) { - totalTimer.stop(); - this.timers.put(TOTAL_OPS, totalTimer.toString()); - } - return this; - } - - public String get(String validationOps) { - return this.timers.getOrDefault(validationOps, DEFAULT_VALUE); - } -} diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java index 89a605f721e1..8fe3e1309cb0 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/TrackerIdentifierCollectorTest.java @@ -65,6 +65,7 @@ import org.hisp.dhis.tracker.imports.domain.Relationship; import org.hisp.dhis.tracker.imports.domain.RelationshipItem; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -81,13 +82,6 @@ void setUp() { @Test void collectTrackedEntities() { - - TrackerIdSchemeParams idSchemes = - TrackerIdSchemeParams.builder() - .idScheme(TrackerIdSchemeParam.ofAttribute("NTVsGflP5Ix")) - .orgUnitIdScheme(TrackerIdSchemeParam.NAME) - .build(); - TrackedEntity trackedEntity = TrackedEntity.builder() .trackedEntity(uid()) @@ -96,10 +90,10 @@ void collectTrackedEntities() { .attributes(teAttributes("VohJnvWfvyo", "qv9xOw8fBzy")) .build(); - TrackerImportParams params = - params(idSchemes).trackedEntities(singletonList(trackedEntity)).build(); + TrackerObjects trackerObjects = + TrackerObjects.builder().trackedEntities(singletonList(trackedEntity)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertContainsOnly(Set.of(trackedEntity.getTrackedEntity()), ids.get(TrackedEntity.class)); @@ -110,13 +104,6 @@ void collectTrackedEntities() { @Test void collectEnrollments() { - - TrackerIdSchemeParams idSchemes = - TrackerIdSchemeParams.builder() - .orgUnitIdScheme(TrackerIdSchemeParam.NAME) - .programIdScheme(TrackerIdSchemeParam.ofAttribute("NTVsGflP5Ix")) - .build(); - Enrollment enrollment = Enrollment.builder() .enrollment(uid()) @@ -126,9 +113,10 @@ void collectEnrollments() { .attributes(teAttributes("VohJnvWfvyo", "qv9xOw8fBzy")) .build(); - TrackerImportParams params = params(idSchemes).enrollments(singletonList(enrollment)).build(); + TrackerObjects trackerObjects = + TrackerObjects.builder().enrollments(singletonList(enrollment)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertContainsOnly(Set.of(enrollment.getUid()), ids.get(Enrollment.class)); @@ -162,9 +150,9 @@ void collectEvents() { .notes(List.of(Note.builder().note("i1vviSlidJE").value("nice day!").build())) .build(); - TrackerImportParams params = params(idSchemes).events(singletonList(event)).build(); + TrackerObjects trackerObjects = TrackerObjects.builder().events(singletonList(event)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertContainsOnly(Set.of(event.getUid()), ids.get(Event.class)); @@ -182,10 +170,9 @@ void collectEvents() { void collectEventsSkipsNotesWithoutAnId() { Event event = Event.builder().notes(List.of(Note.builder().value("nice day!").build())).build(); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()).events(singletonList(event)).build(); + TrackerObjects trackerObjects = TrackerObjects.builder().events(singletonList(event)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertNull(ids.get(org.hisp.dhis.note.Note.class)); @@ -196,10 +183,9 @@ void collectEventsSkipsNotesWithoutAValue() { Event event = Event.builder().notes(List.of(Note.builder().note("i1vviSlidJE").build())).build(); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()).events(singletonList(event)).build(); + TrackerObjects trackerObjects = TrackerObjects.builder().events(singletonList(event)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertNull(ids.get(org.hisp.dhis.note.Note.class)); @@ -222,10 +208,10 @@ void collectRelationships() { .to(RelationshipItem.builder().event(uid()).build()) .build(); - TrackerImportParams params = - params(idSchemes).relationships(singletonList(relationship)).build(); + TrackerObjects trackerObjects = + TrackerObjects.builder().relationships(singletonList(relationship)).build(); - Map, Set> ids = collector.collect(params); + Map, Set> ids = collector.collect(trackerObjects); assertNotNull(ids); assertContainsOnly(Set.of(relationship.getRelationship()), ids.get(Relationship.class)); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java index d1b6c5948c67..dc32d1c6c9f0 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerImporterServiceTest.java @@ -39,12 +39,14 @@ import java.util.List; import java.util.stream.Collectors; import org.hisp.dhis.random.BeanRandomizer; +import org.hisp.dhis.scheduling.NoopJobProgress; import org.hisp.dhis.system.notification.Notifier; import org.hisp.dhis.tracker.imports.DefaultTrackerImportService; import org.hisp.dhis.tracker.imports.ParamsConverter; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerUserService; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preprocess.TrackerPreprocessService; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.validation.ValidationResult; @@ -78,27 +80,26 @@ class TrackerImporterServiceTest { private TrackerImportParams params = null; + private TrackerObjects trackerObjects; + private final BeanRandomizer rnd = BeanRandomizer.create(); @BeforeEach public void setUp() { subject = new DefaultTrackerImportService( - trackerBundleService, - validationService, - trackerPreprocessService, - trackerUserService, - notifier); + trackerBundleService, validationService, trackerPreprocessService, trackerUserService); final List events = rnd.objects(Event.class, 3).collect(Collectors.toList()); - params = - TrackerImportParams.builder() + params = TrackerImportParams.builder().userId("123").build(); + + trackerObjects = + TrackerObjects.builder() .events(events) .enrollments(new ArrayList<>()) .relationships(new ArrayList<>()) .trackedEntities(new ArrayList<>()) - .userId("123") .build(); PersistenceReport persistenceReport = PersistenceReport.emptyReport(); @@ -110,25 +111,26 @@ public void setUp() { when(validationService.validateRuleEngine(any(TrackerBundle.class))) .thenReturn(validationResult); when(trackerPreprocessService.preprocess(any(TrackerBundle.class))) - .thenReturn(ParamsConverter.convert(params)); + .thenReturn(ParamsConverter.convert(params, trackerObjects, new User())); } @Test void testSkipSideEffect() { TrackerImportParams parameters = - TrackerImportParams.builder() - .events(params.getEvents()) + TrackerImportParams.builder().skipSideEffects(true).userId("123").build(); + + TrackerObjects objects = + TrackerObjects.builder() + .events(trackerObjects.getEvents()) .enrollments(new ArrayList<>()) .relationships(new ArrayList<>()) .trackedEntities(new ArrayList<>()) - .skipSideEffects(true) - .userId("123") .build(); - when(trackerBundleService.create(any(TrackerImportParams.class))) - .thenReturn(ParamsConverter.convert(parameters)); + when(trackerBundleService.create(any(TrackerImportParams.class), any(), any())) + .thenReturn(ParamsConverter.convert(parameters, objects, new User())); - subject.importTracker(parameters); + subject.importTracker(parameters, trackerObjects, NoopJobProgress.INSTANCE); verify(trackerBundleService, times(0)).handleTrackerSideEffects(anyList()); } @@ -138,10 +140,10 @@ void testWithSideEffects() { doAnswer(invocationOnMock -> null) .when(trackerBundleService) .handleTrackerSideEffects(anyList()); - when(trackerBundleService.create(any(TrackerImportParams.class))) - .thenReturn(ParamsConverter.convert(params)); + when(trackerBundleService.create(any(TrackerImportParams.class), any(), any())) + .thenReturn(ParamsConverter.convert(params, trackerObjects, new User())); - subject.importTracker(params); + subject.importTracker(params, trackerObjects, NoopJobProgress.INSTANCE); verify(trackerBundleService, times(1)).handleTrackerSideEffects(anyList()); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java index 7b317272e009..84455dbeba55 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/DefaultTrackerPreheatServiceTest.java @@ -37,8 +37,9 @@ import java.util.Collections; import java.util.List; import org.hisp.dhis.common.IdentifiableObjectManager; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.supplier.ClassBasedSupplier; import org.hisp.dhis.tracker.imports.preheat.supplier.PreheatSupplier; import org.hisp.dhis.user.User; @@ -72,12 +73,13 @@ class DefaultTrackerPreheatServiceTest { private DefaultTrackerPreheatService preheatService; - private final TrackerImportParams preheatParams = - TrackerImportParams.builder() - .user(getUser()) + private final TrackerObjects preheatParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(new TrackedEntity())) .build(); + private final TrackerIdSchemeParams idSchemeParams = TrackerIdSchemeParams.builder().build(); + @BeforeEach public void setUp() { preheatService = @@ -95,7 +97,7 @@ void shouldGetFromContextAndAdd() { doCallRealMethod().when(classBasedSupplier).add(any(), any()); - preheatService.preheat(preheatParams); + preheatService.preheat(preheatParams, idSchemeParams, getUser()); verify(applicationContext).getBean(bean.getValue(), preheatSupplierClassCaptor.getValue()); verify(classBasedSupplier).add(any(), any()); @@ -107,7 +109,7 @@ void shouldDoNothingWhenSupplierBeanNotFound() { when(applicationContext.getBean(bean.capture(), preheatSupplierClassCaptor.capture())) .thenThrow(new BeanCreationException("e")); - preheatService.preheat(preheatParams); + preheatService.preheat(preheatParams, idSchemeParams, getUser()); verify(applicationContext).getBean(bean.getValue(), preheatSupplierClassCaptor.getValue()); verify(classBasedSupplier, times(0)).add(any(), any()); @@ -120,7 +122,7 @@ void shouldDoNothingWhenAddException() { .thenReturn(classBasedSupplier); doThrow(new RuntimeException("e")).when(classBasedSupplier).add(any(), any()); - preheatService.preheat(preheatParams); + preheatService.preheat(preheatParams, idSchemeParams, getUser()); verify(applicationContext).getBean(bean.getValue(), preheatSupplierClassCaptor.getValue()); verify(classBasedSupplier).add(any(), any()); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java index 3f0afe9218d1..e1b10b5a4f5f 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/ClassBasedSupplierTest.java @@ -36,8 +36,8 @@ import java.util.HashMap; import java.util.HashSet; import org.hisp.dhis.tracker.imports.TrackerIdentifierCollector; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.ClassBasedSupplierStrategy; import org.hisp.dhis.tracker.imports.preheat.supplier.strategy.GenericStrategy; @@ -63,7 +63,7 @@ class ClassBasedSupplierTest { @Mock private GenericStrategy genericStrategy; - @Mock private TrackerImportParams trackerImportParams; + @Mock private TrackerObjects trackerObjects; @Mock private TrackerEntityStrategy trackerEntityStrategy; @@ -74,7 +74,7 @@ public void setUp() { classBasedSupplier = new ClassBasedSupplier(identifierCollector, strategiesMap); classBasedSupplier.setApplicationContext(applicationContext); - when(identifierCollector.collect(trackerImportParams)) + when(identifierCollector.collect(trackerObjects)) .thenReturn( new HashMap<>() { { @@ -91,7 +91,7 @@ void verifyGenericStrategy() { when(applicationContext.getBean(Constant.GENERIC_STRATEGY_BEAN, GenericStrategy.class)) .thenReturn(genericStrategy); - classBasedSupplier.preheatAdd(trackerImportParams, new TrackerPreheat()); + classBasedSupplier.preheatAdd(trackerObjects, new TrackerPreheat()); verify(applicationContext).getBean(Constant.GENERIC_STRATEGY_BEAN, GenericStrategy.class); } @@ -102,7 +102,7 @@ void verifyClassBasedSupplierStrategy() { when(applicationContext.getBean(anyString(), eq(ClassBasedSupplierStrategy.class))) .thenReturn(trackerEntityStrategy); - classBasedSupplier.preheatAdd(trackerImportParams, new TrackerPreheat()); + classBasedSupplier.preheatAdd(trackerObjects, new TrackerPreheat()); verify(applicationContext).getBean("classbasedstrategy", ClassBasedSupplierStrategy.class); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java index f9fada079f06..6f2e07b02199 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/DuplicateRelationshipSupplierTest.java @@ -39,9 +39,9 @@ import org.hisp.dhis.relationship.RelationshipType; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.RelationshipItem; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -148,12 +148,12 @@ void verifySupplier() { when(relationshipStore.getByUid(List.of(REL_A_UID, REL_B_UID))) .thenReturn(List.of(relationshipA(), relationshipB())); - TrackerImportParams trackerImportParams = - TrackerImportParams.builder() + TrackerObjects trackerObjects = + TrackerObjects.builder() .relationships(List.of(relationshipA, relationshipB, relationshipC)) .build(); - supplier.preheatAdd(trackerImportParams, preheat); + supplier.preheatAdd(trackerObjects, preheat); assertTrue(preheat.isDuplicate(relationshipA)); assertFalse(preheat.isDuplicate(invertTeToTeRelationship(relationshipA))); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java index b04efa42457a..e10fbf54cbd2 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EnrollmentSupplierTest.java @@ -43,7 +43,7 @@ import org.hisp.dhis.program.ProgramStore; import org.hisp.dhis.random.BeanRandomizer; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -73,7 +73,7 @@ class EnrollmentSupplierTest extends DhisConvenienceTest { private Program programWithoutRegistration; - private TrackerImportParams params; + private TrackerObjects params; private final BeanRandomizer rnd = BeanRandomizer.create(); @@ -100,7 +100,7 @@ public void setUp() { when(enrollmentStore.getByPrograms(Lists.newArrayList(programWithoutRegistration))) .thenReturn(enrollments); - params = TrackerImportParams.builder().build(); + params = TrackerObjects.builder().build(); preheat = new TrackerPreheat(); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java index 2274ae89f00e..a251928a66b0 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/EventCategoryOptionComboSupplierTest.java @@ -52,9 +52,9 @@ import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -97,10 +97,10 @@ void shouldPreheatEventAOCIfNotProvided() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); when(preheat.getProgram(event.getProgram())).thenReturn(program); + when(preheat.getIdSchemes()).thenReturn(identifierParams); options.forEach( o -> when(preheat.getCategoryOption(identifierParams.toMetadataIdentifier(o))) @@ -142,9 +142,9 @@ void shouldPreheatEventAOCIfNotProvidedAndEventHasProgramStageButNoProgram() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgramStage(event.getProgramStage())).thenReturn(stage); options.forEach( o -> @@ -183,9 +183,9 @@ void shouldPreheatEventAOCIfNotProvidedOnlyIfNotAlreadyFetched() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event, event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); options.forEach( o -> @@ -228,9 +228,9 @@ void shouldPreheatEventAOCEvenIfNotFound() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event, event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); options.forEach( o -> @@ -271,9 +271,9 @@ void shouldNotPreheatEventAOCIfNotProvidedAndCONotFound() { .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); when(categoryService.getCategoryOptionCombo(categoryCombo, aoc.getCategoryOptions())) .thenReturn(aoc); @@ -304,8 +304,9 @@ void shouldNotPreheatEventAOCIfEventHasNoProgram() { .programStage(MetadataIdentifier.EMPTY_UID) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + + when(preheat.getIdSchemes()).thenReturn(identifierParams); supplier.preheatAdd(params, preheat); @@ -335,8 +336,9 @@ void shouldNotPreheatEventAOCIfEventHasNoProgramAndNoProgramStage() { .programStage(MetadataIdentifier.EMPTY_UID) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + + when(preheat.getIdSchemes()).thenReturn(identifierParams); options.forEach( o -> @@ -374,9 +376,9 @@ void shouldNotPreheatEventAOCIfEventHasNoProgramAndItsProgramStageHasNoProgram() .attributeCategoryOptions(categoryOptionIds(identifierParams, options)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgramStage(event.getProgramStage())).thenReturn(stage); options.forEach( o -> @@ -412,9 +414,9 @@ void shouldNotPreheatEventAOCIfAOCAndCOsAreProvided() { .attributeOptionCombo(identifierParams.toMetadataIdentifier(aoc)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); supplier.preheatAdd(params, preheat); @@ -443,9 +445,9 @@ void shouldNotPreheatEventAOCIfAOCIsProvided() { .attributeOptionCombo(identifierParams.toMetadataIdentifier(aoc)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); supplier.preheatAdd(params, preheat); @@ -474,9 +476,9 @@ void shouldNotPreheatEventAOCIfNoCategoryOptionsProvided() { .attributeOptionCombo(identifierParams.toMetadataIdentifier((CategoryOptionCombo) null)) .build(); List events = List.of(event); - TrackerImportParams params = - TrackerImportParams.builder().idSchemes(identifierParams).events(events).build(); + TrackerObjects params = TrackerObjects.builder().events(events).build(); + when(preheat.getIdSchemes()).thenReturn(identifierParams); when(preheat.getProgram(event.getProgram())).thenReturn(program); supplier.preheatAdd(params, preheat); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java index d5a67a2cb66e..e34306bd2eeb 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/FileResourceSupplierTest.java @@ -43,14 +43,13 @@ import org.hisp.dhis.fileresource.FileResourceService; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -86,8 +85,8 @@ void testSupplierAddsFileResourcesReferencedByTeAttributes() { when(fileResourceService.getFileResources(List.of("kKacJUdANDC"))) .thenReturn(List.of(fileResource)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .trackedEntities( List.of( trackedEntity(numericAttribute(), fileAttribute("hQKI6KcEu5t", "kKacJUdANDC")))) @@ -102,8 +101,8 @@ void testSupplierAddsFileResourcesReferencedByTeAttributes() { void testSupplierDoesNotAddFileResourceIfTeAttributeValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(teaFileResource("hQKI6KcEu5t"))); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .trackedEntities(List.of(trackedEntity(fileAttribute("hQKI6KcEu5t", "")))) .build(); @@ -122,8 +121,8 @@ void testSupplierAddsFileResourcesReferencedByEnrollmentAttributes() { when(fileResourceService.getFileResources(List.of("kKacJUdANDC"))) .thenReturn(List.of(fileResource)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .enrollments( List.of( enrollment(numericAttribute(), fileAttribute("hQKI6KcEu5t", "kKacJUdANDC")))) @@ -144,8 +143,8 @@ void testSupplierAddsFileResourcesReferencedByEventDataElement() { when(fileResourceService.getFileResources(List.of("kKacJUdANDC"))) .thenReturn(List.of(fileResource)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .events( List.of(event(dataValue("numeric", "2"), dataValue("hQKI6KcEu5t", "kKacJUdANDC")))) .build(); @@ -159,10 +158,8 @@ void testSupplierAddsFileResourcesReferencedByEventDataElement() { void testSupplierDoesNotAddFileResourceIfEventDataValueValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(fileDataElement("hQKI6KcEu5t"))); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) - .events(List.of(event(dataValue("hQKI6KcEu5t", "")))) - .build(); + TrackerObjects params = + TrackerObjects.builder().events(List.of(event(dataValue("hQKI6KcEu5t", "")))).build(); supplier.preheatAdd(params, preheat); @@ -189,10 +186,6 @@ private FileResource fileResource(String uid) { return fileResource; } - private TrackerImportParams.TrackerImportParamsBuilder params(TrackerIdSchemeParams idSchemes) { - return TrackerImportParams.builder().idSchemes(idSchemes); - } - private Attribute numericAttribute() { return Attribute.builder() .attribute(MetadataIdentifier.ofUid("numeric")) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java index d887a5538c29..9326f0ea7e24 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/OrgUnitValueTypeSupplierTest.java @@ -43,14 +43,13 @@ import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.trackedentity.TrackedEntityAttribute; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Attribute; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -82,8 +81,8 @@ void testSupplierAddsOrgUnitReferencedByTeAttributes() { when(manager.getByUid(OrganisationUnit.class, List.of("kKacJUdANDC"))) .thenReturn(List.of(orgUnit)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .trackedEntities( List.of( trackedEntity( @@ -99,8 +98,8 @@ void testSupplierAddsOrgUnitReferencedByTeAttributes() { void testSupplierDoesNotAddOrgUnitIfTeAttributeValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(teaOrgUnit("hQKI6KcEu5t"))); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .trackedEntities(List.of(trackedEntity(orgUnitAttribute("hQKI6KcEu5t", "")))) .build(); @@ -118,8 +117,8 @@ void testSupplierAddsOrgUnitReferencedByEnrollmentAttributes() { when(manager.getByUid(OrganisationUnit.class, List.of("kKacJUdANDC"))) .thenReturn(List.of(orgUnit)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .enrollments( List.of( enrollment(numericAttribute(), orgUnitAttribute("hQKI6KcEu5t", "kKacJUdANDC")))) @@ -140,8 +139,8 @@ void testSupplierAddsOrgUnitReferencedByEventDataElement() { when(manager.getByUid(OrganisationUnit.class, List.of("kKacJUdANDC"))) .thenReturn(List.of(orgUnit)); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) + TrackerObjects params = + TrackerObjects.builder() .events( List.of(event(dataValue("numeric", "2"), dataValue("hQKI6KcEu5t", "kKacJUdANDC")))) .build(); @@ -155,10 +154,8 @@ void testSupplierAddsOrgUnitReferencedByEventDataElement() { void testSupplierDoesNotAddOrgUnitIfEventDataValueValueIsEmpty() { preheat.put(TrackerIdSchemeParam.UID, List.of(orgUnitDataElement("hQKI6KcEu5t"))); - TrackerImportParams params = - params(TrackerIdSchemeParams.builder().build()) - .events(List.of(event(dataValue("hQKI6KcEu5t", "")))) - .build(); + TrackerObjects params = + TrackerObjects.builder().events(List.of(event(dataValue("hQKI6KcEu5t", "")))).build(); supplier.preheatAdd(params, preheat); @@ -185,10 +182,6 @@ private OrganisationUnit orgUnit(String uid) { return orgUnit; } - private TrackerImportParams.TrackerImportParamsBuilder params(TrackerIdSchemeParams idSchemes) { - return TrackerImportParams.builder().idSchemes(idSchemes); - } - private Attribute numericAttribute() { return Attribute.builder() .attribute(MetadataIdentifier.ofUid("numeric")) diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java index c2a6cde37893..c9c06a56d47e 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/PeriodTypeSupplierTest.java @@ -36,7 +36,7 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodStore; import org.hisp.dhis.random.BeanRandomizer; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.cache.DefaultPreheatCacheService; import org.hisp.dhis.tracker.imports.preheat.cache.PreheatCacheService; @@ -70,7 +70,7 @@ void verifySupplier() { final List periods = rnd.objects(Period.class, 20).collect(Collectors.toList()); when(periodStore.getAll()).thenReturn(periods); - final TrackerImportParams params = TrackerImportParams.builder().build(); + final TrackerObjects params = TrackerObjects.builder().build(); TrackerPreheat preheat = new TrackerPreheat(); this.supplier.preheatAdd(params, preheat); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java index 99c86ac1f564..078b526715ac 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UniqueAttributeSupplierTest.java @@ -49,8 +49,8 @@ import org.hisp.dhis.trackedentity.TrackedEntityAttributeService; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -77,7 +77,7 @@ class UniqueAttributeSupplierTest extends DhisConvenienceTest { @Mock private TrackedEntityAttributeValueService trackedEntityAttributeValueService; - private TrackerImportParams params; + private TrackerObjects params; private TrackerPreheat preheat; @@ -91,7 +91,7 @@ class UniqueAttributeSupplierTest extends DhisConvenienceTest { @BeforeEach public void setUp() { - params = TrackerImportParams.builder().build(); + params = TrackerObjects.builder().build(); preheat = new TrackerPreheat(); uniqueAttribute = createTrackedEntityAttribute('A', ValueType.TEXT); OrganisationUnit orgUnit = createOrganisationUnit('A'); @@ -121,8 +121,8 @@ void verifySupplierWhenNoUniqueAttributeIsPresentInTheSystem() { void verifySupplierWhenTeAndEnrollmentHaveTheSameUniqueAttribute() { when(trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes()) .thenReturn(Collections.singletonList(uniqueAttribute)); - TrackerImportParams importParams = - TrackerImportParams.builder() + TrackerObjects importParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(trackedEntity())) .enrollments(Collections.singletonList(enrollment(TE_UID))) .build(); @@ -136,8 +136,8 @@ void verifySupplierWhenTeAndEnrollmentHaveTheSameUniqueAttribute() { void verifySupplierWhenTwoTesHaveAttributeWithSameUniqueValue() { when(trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes()) .thenReturn(Collections.singletonList(uniqueAttribute)); - TrackerImportParams importParams = - TrackerImportParams.builder().trackedEntities(sameUniqueAttributeTrackedEntities()).build(); + TrackerObjects importParams = + TrackerObjects.builder().trackedEntities(sameUniqueAttributeTrackedEntities()).build(); this.supplier.preheatAdd(importParams, preheat); @@ -148,8 +148,8 @@ void verifySupplierWhenTwoTesHaveAttributeWithSameUniqueValue() { void verifySupplierWhenTeAndEnrollmentFromAnotherTeHaveAttributeWithSameUniqueValue() { when(trackedEntityAttributeService.getAllUniqueTrackedEntityAttributes()) .thenReturn(Collections.singletonList(uniqueAttribute)); - TrackerImportParams importParams = - TrackerImportParams.builder() + TrackerObjects importParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(trackedEntity())) .enrollments(Collections.singletonList(enrollment(ANOTHER_TE_UID))) .build(); @@ -169,8 +169,8 @@ void verifySupplierWhenTeinPayloadAndDBHaveTheSameUniqueAttribute() { when(trackedEntityAttributeValueService.getUniqueAttributeByValues( trackedEntityAttributeListMap)) .thenReturn(attributeValues); - TrackerImportParams importParams = - TrackerImportParams.builder() + TrackerObjects importParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(trackedEntity())) .build(); @@ -189,8 +189,8 @@ void verifySupplierWhenTeinPayloadAndAnotherTeInDBHaveTheSameUniqueAttribute() { when(trackedEntityAttributeValueService.getUniqueAttributeByValues( trackedEntityAttributeListMap)) .thenReturn(attributeValues); - TrackerImportParams importParams = - TrackerImportParams.builder() + TrackerObjects importParams = + TrackerObjects.builder() .trackedEntities(Collections.singletonList(anotherTrackedEntity())) .build(); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java index 40539cd8d544..96c9f3b8ab90 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/UserSupplierTest.java @@ -41,8 +41,8 @@ import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.random.BeanRandomizer; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Event; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.domain.User; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.user.UserService; @@ -97,7 +97,7 @@ void verifyUserSupplierByUid() { when(manager.getByUid(eq(org.hisp.dhis.user.User.class), argThat(t -> t.containsAll(userIds)))) .thenReturn(users); - final TrackerImportParams params = TrackerImportParams.builder().events(events).build(); + final TrackerObjects params = TrackerObjects.builder().events(events).build(); TrackerPreheat preheat = new TrackerPreheat(); this.supplier.preheatAdd(params, preheat); @@ -117,7 +117,7 @@ void verifyUserSupplierByUsername() { when(userService.getUsersByUsernames(argThat(t -> t.containsAll(usernames)))).thenReturn(users); - final TrackerImportParams params = TrackerImportParams.builder().events(events).build(); + final TrackerObjects params = TrackerObjects.builder().events(events).build(); TrackerPreheat preheat = new TrackerPreheat(); this.supplier.preheatAdd(params, preheat); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java index c312d29bdfd7..679a55664aa9 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/preheat/supplier/strategy/TrackerEntityStrategyTest.java @@ -33,7 +33,6 @@ import java.util.List; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.trackedentity.TrackedEntityStore; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -55,11 +54,6 @@ class TrackerEntityStrategyTest { @Test void verifyStrategyAddRightTeToPreheat() { - final List trackedEntities = - trackedEntities(); - final TrackerImportParams params = - TrackerImportParams.builder().trackedEntities(trackedEntities).build(); - final List uids = List.of("TEIA", "TEIB"); List> splitUids = new ArrayList<>(); @@ -71,7 +65,7 @@ void verifyStrategyAddRightTeToPreheat() { teB.setUid("TEIB"); List dbTrackedEntities = List.of(teA, teB); when(trackedEntityStore.getIncludingDeleted(uids)).thenReturn(dbTrackedEntities); - strategy.add(params, splitUids, preheat); + strategy.add(splitUids, preheat); Mockito.verify(trackedEntityStore).getIncludingDeleted(uids); Mockito.verify(preheat).putTrackedEntities(dbTrackedEntities); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java index ef6e59e58bef..7d031bb72fe9 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/ImportReportTest.java @@ -57,8 +57,6 @@ void testImportCalculatesIgnoredValues() { // Create validation report with 3 objects ValidationReport validationReport = ValidationReport.emptyReport(); validationReport.addErrors(rnd.objects(Error.class, 3).collect(Collectors.toList())); - // Create empty Timing Stats report - TimingsStats timingsStats = new TimingsStats(); // Create payload map Map originalPayload = new HashMap<>(); originalPayload.put(TrackerType.TRACKED_ENTITY, 10); @@ -66,7 +64,7 @@ void testImportCalculatesIgnoredValues() { // Method under test ImportReport rep = ImportReport.withImportCompleted( - Status.OK, persistenceReport, validationReport, timingsStats, originalPayload); + Status.OK, persistenceReport, validationReport, originalPayload); assertThat(rep.getStats().getCreated(), is(8)); assertThat(rep.getStats().getUpdated(), is(6)); assertThat(rep.getStats().getIgnored(), is(3)); diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java index 9fac55491548..0ecabc5ed491 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java +++ b/dhis-2/dhis-services/dhis-service-tracker/src/test/java/org/hisp/dhis/tracker/imports/report/TrackerBundleImportReportTest.java @@ -28,17 +28,9 @@ package org.hisp.dhis.tracker.imports.report; import static org.hisp.dhis.tracker.TrackerType.TRACKED_ENTITY; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.COMMIT_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREHEAT_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PREPARE_REQUEST_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.PROGRAMRULE_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.TOTAL_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.TOTAL_REQUEST_OPS; -import static org.hisp.dhis.tracker.imports.report.TimingsStats.VALIDATION_OPS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import com.fasterxml.jackson.core.JsonProcessingException; @@ -92,7 +84,6 @@ void testImportReportErrors() { assertNotNull(report.getValidationReport()); assertTrue(report.getValidationReport().hasErrors()); assertFalse(report.getValidationReport().hasWarnings()); - assertNull(report.getTimingsStats()); } @Test @@ -106,7 +97,6 @@ void testImportReportWarnings() { assertNotNull(report.getValidationReport()); assertTrue(report.getValidationReport().hasErrors()); assertTrue(report.getValidationReport().hasWarnings()); - assertNull(report.getTimingsStats()); } @Test @@ -119,12 +109,6 @@ void testImportReportFull() { assertNotNull(report.getValidationReport()); assertTrue(report.getValidationReport().hasErrors()); assertTrue(report.getValidationReport().hasWarnings()); - assertNotNull(report.getTimingsStats()); - assertEquals("1 sec.", report.getTimingsStats().getProgramRule()); - assertEquals("2 sec.", report.getTimingsStats().getCommit()); - assertEquals("3 sec.", report.getTimingsStats().getPreheat()); - assertEquals("4 sec.", report.getTimingsStats().getValidation()); - assertEquals("10 sec.", report.getTimingsStats().getTotalImport()); } @Test @@ -141,15 +125,7 @@ void testSerializingAndDeserializingImportReport() throws JsonProcessingExceptio typeReport.getStats().setDeleted(3); typeReportMap.put(TRACKED_ENTITY, typeReport); PersistenceReport persistenceReport = new PersistenceReport(typeReportMap); - // Build TimingsStats - TimingsStats timingsStats = new TimingsStats(); - timingsStats.set(COMMIT_OPS, "0.1 sec."); - timingsStats.set(PREHEAT_OPS, "0.2 sec."); - timingsStats.set(PROGRAMRULE_OPS, "0.3 sec."); - timingsStats.set(TOTAL_OPS, "0.4 sec."); - timingsStats.set(VALIDATION_OPS, "4 sec."); - timingsStats.set(PREPARE_REQUEST_OPS, "0.5 sec."); - timingsStats.set(TOTAL_REQUEST_OPS, "0.6 sec."); + // Build ValidationReport ValidationReport tvr = ValidationReport.emptyReport(); @@ -171,8 +147,7 @@ void testSerializingAndDeserializingImportReport() throws JsonProcessingExceptio final Map bundleSize = new HashMap<>(); bundleSize.put(TRACKED_ENTITY, 1); ImportReport toSerializeReport = - ImportReport.withImportCompleted( - Status.ERROR, persistenceReport, tvr, timingsStats, bundleSize); + ImportReport.withImportCompleted(Status.ERROR, persistenceReport, tvr, bundleSize); // Serialize TrackerImportReport into String String jsonString = jsonMapper.writeValueAsString(toSerializeReport); // Deserialize the String back into TrackerImportReport @@ -244,28 +219,7 @@ void testSerializingAndDeserializingImportReport() throws JsonProcessingExceptio assertEquals( toSerializeReport.getValidationReport().getWarnings().get(0).getTrackerType(), deserializedReport.getValidationReport().getWarnings().get(0).getTrackerType()); - // Verify TimingsStats - assertEquals( - toSerializeReport.getTimingsStats().getCommit(), - deserializedReport.getTimingsStats().getCommit()); - assertEquals( - toSerializeReport.getTimingsStats().getPreheat(), - deserializedReport.getTimingsStats().getPreheat()); - assertEquals( - toSerializeReport.getTimingsStats().getPrepareRequest(), - deserializedReport.getTimingsStats().getPrepareRequest()); - assertEquals( - toSerializeReport.getTimingsStats().getProgramRule(), - deserializedReport.getTimingsStats().getProgramRule()); - assertEquals( - toSerializeReport.getTimingsStats().getTotalImport(), - deserializedReport.getTimingsStats().getTotalImport()); - assertEquals( - toSerializeReport.getTimingsStats().getTotalRequest(), - deserializedReport.getTimingsStats().getTotalRequest()); - assertEquals( - toSerializeReport.getTimingsStats().getValidation(), - deserializedReport.getTimingsStats().getValidation()); + assertEquals(toSerializeReport.getStats(), deserializedReport.getStats()); } @@ -281,17 +235,7 @@ private ImportReport createImportReport() { final Map bundleSize = new HashMap<>(); bundleSize.put(TRACKED_ENTITY, 1); return ImportReport.withImportCompleted( - Status.OK, createBundleReport(), createValidationReport(), createTimingStats(), bundleSize); - } - - private TimingsStats createTimingStats() { - TimingsStats timingsStats = new TimingsStats(); - timingsStats.set(PROGRAMRULE_OPS, "1 sec."); - timingsStats.set(COMMIT_OPS, "2 sec."); - timingsStats.set(PREHEAT_OPS, "3 sec."); - timingsStats.set(VALIDATION_OPS, "4 sec."); - timingsStats.set(TOTAL_OPS, "10 sec."); - return timingsStats; + Status.OK, createBundleReport(), createValidationReport(), bundleSize); } private ValidationReport createValidationReport() { diff --git a/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java b/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java index 94e394d1fa67..47cfb12c81ed 100644 --- a/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java +++ b/dhis-2/dhis-test-e2e/src/main/java/org/hisp/dhis/actions/tracker/TrackerImportExportActions.java @@ -92,6 +92,10 @@ public TrackerApiResponse postAndGetJobReport( return getJobReportByImportResponse(response); } + public ApiResponse checkJobReport(String jobId, String reportMode) { + return this.get(String.format("/jobs/%s/report?reportMode=%s", jobId, reportMode)); + } + public TrackerApiResponse getJobReport(String jobId, String reportMode) { ApiResponse response = this.get(String.format("/jobs/%s/report?reportMode=%s", jobId, reportMode)); @@ -189,6 +193,10 @@ private TrackerApiResponse getJobReportByImportResponse(ApiResponse response) { this.waitUntilJobIsCompleted(jobId); + Callable jobIsCompleted = () -> this.checkJobReport(jobId, "FULL").statusCode(); + + with().atMost(21, TimeUnit.SECONDS).await().until(() -> jobIsCompleted.call() == 200); + return this.getJobReport(jobId, "FULL"); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java index 7d9e651125c2..f4cc60be6c72 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/dxf2/deprecated/tracker/AclEventExporterTest.java @@ -53,6 +53,7 @@ import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.junit.jupiter.api.BeforeEach; @@ -75,9 +76,9 @@ class AclEventExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); User userA = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment.json", userA.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); ProgramStage programStage = get(ProgramStage.class, "NpsdDv6kKSO"); program = programStage.getProgram(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java index 2e12ed6d11e1..fe5f8e89b73b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/TrackerTest.java @@ -44,7 +44,7 @@ import org.hisp.dhis.render.RenderFormat; import org.hisp.dhis.render.RenderService; import org.hisp.dhis.test.integration.SingleSetupIntegrationTestBase; -import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -107,26 +107,8 @@ protected ObjectBundle setUpMetadata(String path, User user) throws IOException return bundle; } - protected TrackerImportParams fromJson(String path) throws IOException { - TrackerImportParams trackerImportParams = _fromJson(path); - trackerImportParams.setUser(currentUserService.getCurrentUser()); - return trackerImportParams; - } - - protected TrackerImportParams fromJson(String path, String userUid) throws IOException { - TrackerImportParams trackerImportParams = _fromJson(path); - trackerImportParams.setUserId(userUid); - return trackerImportParams; - } - - protected TrackerImportParams fromJson(String path, User user) throws IOException { - TrackerImportParams trackerImportParams = _fromJson(path); - trackerImportParams.setUser(user); - return trackerImportParams; - } - - private TrackerImportParams _fromJson(String path) throws IOException { + protected TrackerObjects fromJson(String path) throws IOException { return renderService.fromJson( - new ClassPathResource(path).getInputStream(), TrackerImportParams.class); + new ClassPathResource(path).getInputStream(), TrackerObjects.class); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java index 28c706005044..6a6c1fcbf173 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/OrderAndPaginationExporterTest.java @@ -74,6 +74,7 @@ import org.hisp.dhis.tracker.export.relationship.RelationshipService; import org.hisp.dhis.tracker.export.trackedentity.TrackedEntityOperationParams; import org.hisp.dhis.tracker.export.trackedentity.TrackedEntityService; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.hisp.dhis.webapi.controller.event.mapper.SortDirection; @@ -110,9 +111,9 @@ class OrderAndPaginationExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); importUser = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(importUser.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment.json", importUser.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); programStage = get(ProgramStage.class, "NpsdDv6kKSO"); trackedEntityType = get(TrackedEntityType.class, "ja8NY4PW7Xm"); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java index c2bd259a0c20..edfe77fef37e 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/AclEventExporterTest.java @@ -59,6 +59,7 @@ import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.junit.jupiter.api.BeforeEach; @@ -84,9 +85,9 @@ class AclEventExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); User userA = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment.json", userA.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); ProgramStage programStage = get(ProgramStage.class, "NpsdDv6kKSO"); program = programStage.getProgram(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java index 33ebe1e366ef..e99448529462 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/export/event/EventExporterTest.java @@ -72,6 +72,7 @@ import org.hisp.dhis.relationship.RelationshipItem; import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.user.User; import org.hisp.dhis.util.DateUtils; @@ -108,9 +109,9 @@ class EventExporterTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); importUser = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(importUser.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment.json", importUser.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/event_and_enrollment.json"))); orgUnit = get(OrganisationUnit.class, "h4w96yEMlzO"); programStage = get(ProgramStage.class, "NpsdDv6kKSO"); program = programStage.getProgram(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java index da06b0dad95d..9f6ea3eff68c 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/AtomicModeIntegrationTest.java @@ -34,6 +34,7 @@ import java.io.IOException; import org.hisp.dhis.trackedentity.TrackedEntityService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.junit.jupiter.api.Test; @@ -52,10 +53,12 @@ public void initTest() throws IOException { @Test void testImportSuccessWithAtomicModeObjectIfThereIsAnErrorInOneTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/one_valid_tei_and_one_invalid.json"); - params.setAtomicMode(AtomicMode.OBJECT); + TrackerObjects trackerObjects = fromJson("tracker/one_valid_tei_and_one_invalid.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).build(); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportTeiReport); assertEquals(Status.OK, trackerImportTeiReport.getStatus()); @@ -66,10 +69,11 @@ void testImportSuccessWithAtomicModeObjectIfThereIsAnErrorInOneTEI() throws IOEx @Test void testImportFailWithAtomicModeAllIfThereIsAnErrorInOneTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/one_valid_tei_and_one_invalid.json"); - params.setAtomicMode(AtomicMode.ALL); + TrackerObjects trackerObjects = fromJson("tracker/one_valid_tei_and_one_invalid.json"); + TrackerImportParams params = TrackerImportParams.builder().atomicMode(AtomicMode.ALL).build(); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportTeiReport); assertEquals(Status.ERROR, trackerImportTeiReport.getStatus()); assertEquals(1, trackerImportTeiReport.getValidationReport().getErrors().size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java index 21edc0b6da59..0ae89946dddc 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/TrackerImportParamsSerdeTest.java @@ -28,7 +28,6 @@ package org.hisp.dhis.tracker.imports; import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import java.io.IOException; @@ -83,12 +82,7 @@ void testJsonSerialization() throws Exception { + "\"validationMode\":\"SKIP\"," + "\"skipPatternValidation\":false," + "\"skipSideEffects\":false," - + "\"skipRuleEngine\":true," - + "\"trackedEntities\":[]," - + "\"enrollments\":[]," - + "\"events\":[]," - + "\"relationships\":[]," - + "\"username\":\"system-process\"}", + + "\"skipRuleEngine\":true}", json, JSONCompareMode.LENIENT); } @@ -111,12 +105,7 @@ void testJsonDeserialization() throws IOException { + "\"validationMode\":\"SKIP\"," + "\"skipPatternValidation\":true," + "\"skipSideEffects\":true," - + "\"skipRuleEngine\":true," - + "\"trackedEntities\":[]," - + "\"enrollments\":[]," - + "\"events\":[]," - + "\"relationships\":[]," - + "\"username\":\"system-process\"}"; + + "\"skipRuleEngine\":true}"; final TrackerImportParams trackerImportParams = renderService.fromJson(json, TrackerImportParams.class); @@ -129,7 +118,6 @@ void testJsonDeserialization() throws IOException { assertThat(trackerImportParams.isSkipPatternValidation(), is(true)); assertThat(trackerImportParams.isSkipSideEffects(), is(true)); assertThat(trackerImportParams.isSkipRuleEngine(), is(true)); - assertThat(trackerImportParams.getUser(), is(nullValue())); TrackerIdSchemeParams idSchemes = trackerImportParams.getIdSchemes(); assertThat(idSchemes.getIdScheme(), is(TrackerIdSchemeParam.CODE)); assertThat(idSchemes.getProgramIdScheme().getIdScheme(), is(TrackerIdScheme.ATTRIBUTE)); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java index bd652e88b4df..8b5ef6f4e2f1 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/EventDataValueTest.java @@ -45,6 +45,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.junit.jupiter.api.Test; @@ -66,12 +67,11 @@ protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); final User userA = userService.getUser("M5zQapPyTZI"); injectSecurityContext(userA); - - TrackerImportParams teiParams = fromJson("tracker/single_tei.json", userA.getUid()); - assertNoErrors(trackerImportService.importTracker(teiParams)); - TrackerImportParams enrollmentParams = - fromJson("tracker/single_enrollment.json", userA.getUid()); - assertNoErrors(trackerImportService.importTracker(enrollmentParams)); + TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + assertNoErrors(trackerImportService.importTracker(params, trackerObjects)); + TrackerObjects enTrackerObjects = fromJson("tracker/single_enrollment.json"); + assertNoErrors(trackerImportService.importTracker(params, enTrackerObjects)); manager.flush(); } @@ -79,7 +79,7 @@ protected void initTest() throws IOException { void successWhenEventHasNoProgramAndHasProgramStage() throws IOException { ImportReport importReport = trackerImportService.importTracker( - fromJson("tracker/validations/events-with_no_program.json")); + new TrackerImportParams(), fromJson("tracker/validations/events-with_no_program.json")); assertNoErrors(importReport); } @@ -87,7 +87,8 @@ void successWhenEventHasNoProgramAndHasProgramStage() throws IOException { @Test void testEventDataValue() throws IOException { ImportReport importReport = - trackerImportService.importTracker(fromJson("tracker/event_with_data_values.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/event_with_data_values.json")); assertNoErrors(importReport); List events = manager.getAll(Event.class); @@ -99,8 +100,9 @@ void testEventDataValue() throws IOException { @Test void testEventDataValueUpdate() throws IOException { - ImportReport importReport = - trackerImportService.importTracker(fromJson("tracker/event_with_data_values.json")); + TrackerObjects trackerObjects = fromJson("tracker/event_with_data_values.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List events = manager.getAll(Event.class); @@ -109,17 +111,10 @@ void testEventDataValueUpdate() throws IOException { Set eventDataValues = event.getEventDataValues(); assertEquals(4, eventDataValues.size()); // update - TrackerImportParams trackerImportParams = - fromJson("tracker/event_with_updated_data_values.json"); - // make sure that the uid property is populated as well - otherwise - // update will - // not work - trackerImportParams - .getEvents() - .get(0) - .setEvent(trackerImportParams.getEvents().get(0).getEvent()); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + + TrackerObjects updatedTrackerObjects = fromJson("tracker/event_with_updated_data_values.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, updatedTrackerObjects); assertNoErrors(importReport); List updatedEvents = manager.getAll(Event.class); assertEquals(1, updatedEvents.size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java index af021c5f645b..e04fe595b412 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/LastUpdateImportTest.java @@ -44,6 +44,7 @@ import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.EnrollmentStatus; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -61,16 +62,19 @@ class LastUpdateImportTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); injectAdminUser(); - TrackerImportParams trackerImportParams = fromJson("tracker/single_tei.json"); - assertNoErrors(trackerImportService.importTracker(trackerImportParams)); - trackedEntity = trackerImportParams.getTrackedEntities().get(0); - assertNoErrors(trackerImportService.importTracker(fromJson("tracker/single_enrollment.json"))); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + assertNoErrors(trackerImportService.importTracker(new TrackerImportParams(), trackerObjects)); + trackedEntity = trackerObjects.getTrackedEntities().get(0); + assertNoErrors( + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/single_enrollment.json"))); manager.flush(); } @Test void shouldUpdateTeiIfTeiIsUpdated() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); trackerImportParams.setImportStrategy(TrackerImportStrategy.UPDATE); Attribute attribute = Attribute.builder() @@ -80,7 +84,7 @@ void shouldUpdateTeiIfTeiIsUpdated() throws IOException { trackedEntity.setAttributes(Collections.singletonList(attribute)); Date lastUpdateBefore = trackedEntityService.getTrackedEntity(trackedEntity.getTrackedEntity()).getLastUpdated(); - assertNoErrors(trackerImportService.importTracker(trackerImportParams)); + assertNoErrors(trackerImportService.importTracker(trackerImportParams, trackerObjects)); assertTrue( manager .get(TrackedEntity.class, trackedEntity.getTrackedEntity()) @@ -91,14 +95,15 @@ void shouldUpdateTeiIfTeiIsUpdated() throws IOException { @Test void shouldUpdateTeiIfEventIsUpdated() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/event_with_data_values.json"); + TrackerObjects trackerObjects = fromJson("tracker/event_with_data_values.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); Date lastUpdateBefore = trackedEntityService.getTrackedEntity(trackedEntity.getTrackedEntity()).getLastUpdated(); - assertNoErrors(trackerImportService.importTracker(trackerImportParams)); + assertNoErrors(trackerImportService.importTracker(trackerImportParams, trackerObjects)); - trackerImportParams = fromJson("tracker/event_with_updated_data_values.json"); + trackerObjects = fromJson("tracker/event_with_updated_data_values.json"); trackerImportParams.setImportStrategy(TrackerImportStrategy.UPDATE); - assertNoErrors(trackerImportService.importTracker(trackerImportParams)); + assertNoErrors(trackerImportService.importTracker(trackerImportParams, trackerObjects)); manager.clear(); assertTrue( manager @@ -110,13 +115,15 @@ void shouldUpdateTeiIfEventIsUpdated() throws IOException { @Test void shouldUpdateTeiIfEnrollmentIsUpdated() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/single_enrollment.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_enrollment.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); Date lastUpdateBefore = trackedEntityService.getTrackedEntity(trackedEntity.getTrackedEntity()).getLastUpdated(); - Enrollment enrollment = trackerImportParams.getEnrollments().get(0); + Enrollment enrollment = trackerObjects.getEnrollments().get(0); enrollment.setStatus(EnrollmentStatus.COMPLETED); trackerImportParams.setImportStrategy(TrackerImportStrategy.UPDATE); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(trackerImportParams, trackerObjects); assertNoErrors(importReport); manager.clear(); assertTrue( diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java index 9c2517c0ad18..017ca502bac7 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/OwnershipTest.java @@ -52,6 +52,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; import org.hisp.dhis.tracker.imports.domain.EnrollmentStatus; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.validation.ValidationCode; import org.hisp.dhis.user.User; @@ -80,18 +81,16 @@ protected void initTest() throws IOException { injectSecurityContext(superUser); nonSuperUser = userService.getUser("Tu9fv8ezgHl"); + TrackerImportParams params = TrackerImportParams.builder().userId(superUser.getUid()).build(); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/ownership_tei.json", superUser.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/ownership_tei.json"))); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/ownership_enrollment.json", superUser.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/ownership_enrollment.json"))); } @Test void testProgramOwnerWhenEnrolled() throws IOException { - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -104,15 +103,11 @@ void testProgramOwnerWhenEnrolled() throws IOException { assertNotNull(tepo.getTrackedEntity()); assertNotNull(tepo.getProgram()); assertNotNull(tepo.getOrganisationUnit()); - assertTrue(enrollmentParams.getEnrollments().get(0).getProgram().isEqualTo(tepo.getProgram())); + assertTrue(trackerObjects.getEnrollments().get(0).getProgram().isEqualTo(tepo.getProgram())); assertTrue( - enrollmentParams - .getEnrollments() - .get(0) - .getOrgUnit() - .isEqualTo(tepo.getOrganisationUnit())); + trackerObjects.getEnrollments().get(0).getOrgUnit().isEqualTo(tepo.getOrganisationUnit())); assertEquals( - enrollmentParams.getEnrollments().get(0).getTrackedEntity(), + trackerObjects.getEnrollments().get(0).getTrackedEntity(), tepo.getTrackedEntity().getUid()); } @@ -120,14 +115,13 @@ void testProgramOwnerWhenEnrolled() throws IOException { void testClientDatesForTeiEnrollmentEvent() throws IOException { User nonSuperUser = userService.getUser(this.nonSuperUser.getUid()); injectSecurityContext(nonSuperUser); - - TrackerImportParams trackerImportParams = - fromJson("tracker/ownership_event.json", nonSuperUser); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_event.json"); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); manager.flush(); - TrackerImportParams teParams = fromJson("tracker/ownership_tei.json", nonSuperUser); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser); + TrackerObjects teTrackerObjects = fromJson("tracker/ownership_tei.json"); + TrackerObjects enTrackerObjects = fromJson("tracker/ownership_enrollment.json"); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -136,10 +130,10 @@ void testClientDatesForTeiEnrollmentEvent() throws IOException { assertNotNull(te.getCreatedAtClient()); assertNotNull(te.getLastUpdatedAtClient()); assertEquals( - DateUtils.fromInstant(teParams.getTrackedEntities().get(0).getCreatedAtClient()), + DateUtils.fromInstant(teTrackerObjects.getTrackedEntities().get(0).getCreatedAtClient()), te.getCreatedAtClient()); assertEquals( - DateUtils.fromInstant(teParams.getTrackedEntities().get(0).getUpdatedAtClient()), + DateUtils.fromInstant(teTrackerObjects.getTrackedEntities().get(0).getUpdatedAtClient()), te.getLastUpdatedAtClient()); Set enrollments = te.getEnrollments(); assertEquals(1, enrollments.size()); @@ -147,10 +141,10 @@ void testClientDatesForTeiEnrollmentEvent() throws IOException { assertNotNull(enrollment.getCreatedAtClient()); assertNotNull(enrollment.getLastUpdatedAtClient()); assertEquals( - DateUtils.fromInstant(enrollmentParams.getEnrollments().get(0).getCreatedAtClient()), + DateUtils.fromInstant(enTrackerObjects.getEnrollments().get(0).getCreatedAtClient()), enrollment.getCreatedAtClient()); assertEquals( - DateUtils.fromInstant(enrollmentParams.getEnrollments().get(0).getUpdatedAtClient()), + DateUtils.fromInstant(enTrackerObjects.getEnrollments().get(0).getUpdatedAtClient()), enrollment.getLastUpdatedAtClient()); Set events = enrollment.getEvents(); assertEquals(1, events.size()); @@ -158,34 +152,35 @@ void testClientDatesForTeiEnrollmentEvent() throws IOException { assertNotNull(event.getCreatedAtClient()); assertNotNull(event.getLastUpdatedAtClient()); assertEquals( - DateUtils.fromInstant(trackerImportParams.getEvents().get(0).getCreatedAtClient()), + DateUtils.fromInstant(trackerObjects.getEvents().get(0).getCreatedAtClient()), event.getCreatedAtClient()); assertEquals( - DateUtils.fromInstant(trackerImportParams.getEvents().get(0).getUpdatedAtClient()), + DateUtils.fromInstant(trackerObjects.getEvents().get(0).getUpdatedAtClient()), event.getLastUpdatedAtClient()); } @Test void testUpdateEnrollment() throws IOException { - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); Enrollment enrollment = enrollments.stream().filter(e -> e.getUid().equals("TvctPPhpD8u")).findAny().get(); - compareEnrollmentBasicProperties(enrollment, enrollmentParams.getEnrollments().get(0)); + compareEnrollmentBasicProperties(enrollment, trackerObjects.getEnrollments().get(0)); assertNull(enrollment.getCompletedBy()); assertNull(enrollment.getCompletedDate()); org.hisp.dhis.tracker.imports.domain.Enrollment updatedEnrollment = - enrollmentParams.getEnrollments().get(0); + trackerObjects.getEnrollments().get(0); updatedEnrollment.setStatus(EnrollmentStatus.COMPLETED); updatedEnrollment.setCreatedAtClient(Instant.now()); updatedEnrollment.setUpdatedAtClient(Instant.now()); updatedEnrollment.setEnrolledAt(Instant.now()); updatedEnrollment.setOccurredAt(Instant.now()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); manager.flush(); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getUpdated()); @@ -199,13 +194,14 @@ void testUpdateEnrollment() throws IOException { @Test void testDeleteEnrollment() throws IOException { - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); enrollments.stream().filter(e -> e.getUid().equals("TvctPPhpD8u")).findAny().get(); - enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getDeleted()); enrollments = manager.getAll(Enrollment.class); @@ -215,19 +211,20 @@ void testDeleteEnrollment() throws IOException { @Test void testCreateEnrollmentAfterDeleteEnrollment() throws IOException { injectSecurityContext(userService.getUser(nonSuperUser.getUid())); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getDeleted()); enrollments = manager.getAll(Enrollment.class); assertEquals(1, enrollments.size()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE); - enrollmentParams.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); - updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.CREATE); + trackerObjects.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); + updatedReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getCreated()); enrollments = manager.getAll(Enrollment.class); @@ -237,21 +234,22 @@ void testCreateEnrollmentAfterDeleteEnrollment() throws IOException { @Test void testCreateEnrollmentWithoutOwnership() throws IOException { injectSecurityContext(userService.getUser(nonSuperUser.getUid())); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); List enrollments = manager.getAll(Enrollment.class); assertEquals(2, enrollments.size()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(updatedReport); assertEquals(1, updatedReport.getStats().getDeleted()); TrackedEntity te = manager.get(TrackedEntity.class, "IOR1AXXl24H"); OrganisationUnit ou = manager.get(OrganisationUnit.class, "B1nCbRV3qtP"); Program pgm = manager.get(Program.class, "BFcipDERJnf"); trackerOwnershipManager.transferOwnership(te, pgm, ou, true, false); - enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE); - enrollmentParams.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); - updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.CREATE); + trackerObjects.getEnrollments().get(0).setEnrollment(CodeGenerator.generateUid()); + updatedReport = trackerImportService.importTracker(params, trackerObjects); assertEquals(1, updatedReport.getStats().getIgnored()); assertHasError(updatedReport, ValidationCode.E1102); } @@ -262,11 +260,12 @@ void testDeleteEnrollmentWithoutOwnership() throws IOException { TrackedEntity te = manager.get(TrackedEntity.class, "IOR1AXXl24H"); OrganisationUnit ou = manager.get(OrganisationUnit.class, "B1nCbRV3qtP"); Program pgm = manager.get(Program.class, "BFcipDERJnf"); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); trackerOwnershipManager.transferOwnership(te, pgm, ou, true, false); - enrollmentParams.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + params.setImportStrategy(TrackerImportStrategy.DELETE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertEquals(1, updatedReport.getStats().getIgnored()); assertHasError(updatedReport, ValidationCode.E1102); } @@ -278,10 +277,11 @@ void testUpdateEnrollmentWithoutOwnership() throws IOException { OrganisationUnit ou = manager.get(OrganisationUnit.class, "B1nCbRV3qtP"); Program pgm = manager.get(Program.class, "BFcipDERJnf"); trackerOwnershipManager.transferOwnership(te, pgm, ou, true, false); - TrackerImportParams enrollmentParams = - fromJson("tracker/ownership_enrollment.json", nonSuperUser.getUid()); - enrollmentParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport updatedReport = trackerImportService.importTracker(enrollmentParams); + TrackerImportParams params = + TrackerImportParams.builder().userId(nonSuperUser.getUid()).build(); + TrackerObjects trackerObjects = fromJson("tracker/ownership_enrollment.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + ImportReport updatedReport = trackerImportService.importTracker(params, trackerObjects); assertEquals(1, updatedReport.getStats().getIgnored()); assertHasError(updatedReport, ValidationCode.E1102); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java index fb8daad5335f..c617089cb10c 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/RelationshipImportTest.java @@ -37,6 +37,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.hisp.dhis.user.User; @@ -58,31 +59,33 @@ class RelationshipImportTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/simple_metadata.json"); userA = userService.getUser("M5zQapPyTZI"); + TrackerImportParams params = TrackerImportParams.builder().userId(userA.getUid()).build(); + assertNoErrors(trackerImportService.importTracker(params, fromJson("tracker/single_tei.json"))); assertNoErrors( - trackerImportService.importTracker(fromJson("tracker/single_tei.json", userA.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/single_enrollment.json"))); assertNoErrors( - trackerImportService.importTracker( - fromJson("tracker/single_enrollment.json", userA.getUid()))); - assertNoErrors( - trackerImportService.importTracker(fromJson("tracker/single_event.json", userA.getUid()))); + trackerImportService.importTracker(params, fromJson("tracker/single_event.json"))); manager.flush(); } @Test void successImportingRelationships() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/relationships.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/relationships.json")); assertThat(importReport.getStatus(), is(Status.OK)); assertThat(importReport.getStats().getCreated(), is(2)); } @Test void successUpdateRelationships() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/relationships.json"); - trackerImportService.importTracker(trackerImportParams); - trackerImportParams = fromJson("tracker/relationshipToUpdate.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/relationships.json"); + trackerImportService.importTracker(trackerImportParams, trackerObjects); + trackerObjects = fromJson("tracker/relationshipToUpdate.json"); trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(trackerImportParams, trackerObjects); assertThat(importReport.getStatus(), is(Status.OK)); assertThat(importReport.getStats().getCreated(), is(0)); assertThat(importReport.getStats().getIgnored(), is(1)); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java index ed4ca445cb27..b3e5a208b125 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryDeleteIntegrationTest.java @@ -41,6 +41,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.validation.ValidationCode; @@ -58,12 +59,13 @@ class ReportSummaryDeleteIntegrationTest extends TrackerTest { protected void initTest() throws IOException { setUpMetadata("tracker/tracker_basic_metadata.json"); injectAdminUser(); - TrackerImportParams params = fromJson("tracker/tracker_basic_data_before_deletion.json"); - assertEquals(13, params.getTrackedEntities().size()); - assertEquals(2, params.getEnrollments().size()); - assertEquals(2, params.getEvents().size()); + TrackerObjects trackerObjects = fromJson("tracker/tracker_basic_data_before_deletion.json"); + assertEquals(13, trackerObjects.getTrackedEntities().size()); + assertEquals(2, trackerObjects.getEnrollments().size()); + assertEquals(2, trackerObjects.getEvents().size()); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); PersistenceReport persistenceReport = importReport.getPersistenceReport(); assertImportedObjects(13, persistenceReport, TrackerType.TRACKED_ENTITY); @@ -77,11 +79,12 @@ protected void initTest() throws IOException { @Test void testTrackedEntityDeletion() throws IOException { - TrackerImportParams params = fromJson("tracker/tracked_entity_basic_data_for_deletion.json"); + TrackerObjects trackerObjects = fromJson("tracker/tracked_entity_basic_data_for_deletion.json"); + TrackerImportParams params = new TrackerImportParams(); params.setImportStrategy(TrackerImportStrategy.DELETE); - assertEquals(9, params.getTrackedEntities().size()); + assertEquals(9, trackerObjects.getTrackedEntities().size()); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertDeletedObjects(9, importReport.getPersistenceReport(), TrackerType.TRACKED_ENTITY); // remaining @@ -93,10 +96,11 @@ void testTrackedEntityDeletion() throws IOException { void testEnrollmentDeletion() throws IOException { dbmsManager.clearSession(); assertEquals(2, manager.getAll(Event.class).size()); - TrackerImportParams params = fromJson("tracker/enrollment_basic_data_for_deletion.json"); + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/enrollment_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertDeletedObjects(1, importReport.getPersistenceReport(), TrackerType.ENROLLMENT); @@ -108,10 +112,11 @@ void testEnrollmentDeletion() throws IOException { @Test void testEventDeletion() throws IOException { - TrackerImportParams params = fromJson("tracker/event_basic_data_for_deletion.json"); + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/event_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertDeletedObjects(1, importReport.getPersistenceReport(), TrackerType.EVENT); @@ -121,21 +126,23 @@ void testEventDeletion() throws IOException { @Test void testNonExistentEnrollment() throws IOException { - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/non_existent_enrollment_basic_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasError(importReport, ValidationCode.E1081); } @Test void testDeleteMultipleEntities() throws IOException { - TrackerImportParams params = fromJson("tracker/tracker_data_for_deletion.json"); + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/tracker_data_for_deletion.json"); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertDeletedObjects(1, importReport.getPersistenceReport(), TrackerType.ENROLLMENT); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java index 3f2221e5af24..c0c7e4575eb4 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/ReportSummaryIntegrationTest.java @@ -37,6 +37,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.hisp.dhis.user.User; @@ -59,11 +60,12 @@ protected void initTest() throws IOException { @Test void testStatsCountForOneCreatedTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); - params.setUserId(userA.getUid()); - params.setAtomicMode(AtomicMode.OBJECT); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportTeiReport); assertEquals(1, trackerImportTeiReport.getStats().getCreated()); @@ -74,16 +76,19 @@ void testStatsCountForOneCreatedTEI() throws IOException { @Test void testStatsCountForOneCreatedAndOneUpdatedTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_tei_and_one_new_tei.json"); + trackerObjects = fromJson("tracker/one_update_tei_and_one_new_tei.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportTeiReport); assertEquals(1, trackerImportTeiReport.getStats().getCreated()); @@ -94,17 +99,20 @@ void testStatsCountForOneCreatedAndOneUpdatedTEI() throws IOException { @Test void testStatsCountForOneCreatedAndOneUpdatedTEIAndOneInvalidTEI() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_tei_and_one_new_tei_and_one_invalid_tei.json"); + trackerObjects = fromJson("tracker/one_update_tei_and_one_new_tei_and_one_invalid_tei.json"); params.setUserId(userA.getUid()); params.setAtomicMode(AtomicMode.OBJECT); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportTeiReport = trackerImportService.importTracker(params); + ImportReport trackerImportTeiReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportTeiReport); assertEquals(Status.OK, trackerImportTeiReport.getStatus()); @@ -117,16 +125,19 @@ void testStatsCountForOneCreatedAndOneUpdatedTEIAndOneInvalidTEI() throws IOExce @Test void testStatsCountForOneCreatedEnrollment() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); + ImportReport trackerImportEnrollmentReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEnrollmentReport); assertEquals(1, trackerImportEnrollmentReport.getStats().getCreated()); @@ -137,16 +148,19 @@ void testStatsCountForOneCreatedEnrollment() throws IOException { @Test void testStatsCountForOneCreatedEnrollmentAndUpdateSameEnrollment() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); + ImportReport trackerImportEnrollmentReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEnrollmentReport); assertEquals(1, trackerImportEnrollmentReport.getStats().getCreated()); @@ -154,11 +168,11 @@ void testStatsCountForOneCreatedEnrollmentAndUpdateSameEnrollment() throws IOExc assertEquals(0, trackerImportEnrollmentReport.getStats().getIgnored()); assertEquals(0, trackerImportEnrollmentReport.getStats().getDeleted()); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - trackerImportEnrollmentReport = trackerImportService.importTracker(params); + trackerImportEnrollmentReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEnrollmentReport); assertEquals(0, trackerImportEnrollmentReport.getStats().getCreated()); @@ -169,21 +183,24 @@ void testStatsCountForOneCreatedEnrollmentAndUpdateSameEnrollment() throws IOExc @Test void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollment() throws IOException { - TrackerImportParams params = fromJson("tracker/one_update_tei_and_one_new_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/one_update_tei_and_one_new_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_enrollment_and_one_new_enrollment.json"); + trackerObjects = fromJson("tracker/one_update_enrollment_and_one_new_enrollment.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); + ImportReport trackerImportEnrollmentReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEnrollmentReport); assertEquals(1, trackerImportEnrollmentReport.getStats().getCreated()); @@ -195,23 +212,26 @@ void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollment() throws IOExce @Test void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollmentAndOneInvalidEnrollment() throws IOException { - TrackerImportParams params = fromJson("tracker/three_teis.json"); + TrackerObjects trackerObjects = fromJson("tracker/three_teis.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_and_one_new_and_one_invalid_enrollment.json"); + trackerObjects = fromJson("tracker/one_update_and_one_new_and_one_invalid_enrollment.json"); params.setUserId(userA.getUid()); params.setAtomicMode(AtomicMode.OBJECT); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEnrollmentReport = trackerImportService.importTracker(params); + ImportReport trackerImportEnrollmentReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportEnrollmentReport); assertEquals(Status.OK, trackerImportEnrollmentReport.getStatus()); @@ -224,20 +244,23 @@ void testStatsCountForOneUpdateEnrollmentAndOneCreatedEnrollmentAndOneInvalidEnr @Test void testStatsCountForOneCreatedEvent() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_event.json"); + trackerObjects = fromJson("tracker/single_event.json"); params.setUserId(userA.getUid()); - ImportReport trackerImportEventReport = trackerImportService.importTracker(params); + ImportReport trackerImportEventReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEventReport); assertEquals(1, trackerImportEventReport.getStats().getCreated()); @@ -248,26 +271,29 @@ void testStatsCountForOneCreatedEvent() throws IOException { @Test void testStatsCountForOneUpdateEventAndOneNewEvent() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_event.json"); + trackerObjects = fromJson("tracker/single_event.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_event_and_one_new_event.json"); + trackerObjects = fromJson("tracker/one_update_event_and_one_new_event.json"); params.setUserId(userA.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEventReport = trackerImportService.importTracker(params); + ImportReport trackerImportEventReport = + trackerImportService.importTracker(params, trackerObjects); assertNoErrors(trackerImportEventReport); assertEquals(1, trackerImportEventReport.getStats().getCreated()); @@ -278,27 +304,30 @@ void testStatsCountForOneUpdateEventAndOneNewEvent() throws IOException { @Test void testStatsCountForOneUpdateEventAndOneNewEventAndOneInvalidEvent() throws IOException { - TrackerImportParams params = fromJson("tracker/single_tei.json"); + TrackerObjects trackerObjects = fromJson("tracker/single_tei.json"); + TrackerImportParams params = + TrackerImportParams.builder().atomicMode(AtomicMode.OBJECT).userId(userA.getUid()).build(); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_enrollment.json"); + trackerObjects = fromJson("tracker/single_enrollment.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/single_event.json"); + trackerObjects = fromJson("tracker/single_event.json"); params.setUserId(userA.getUid()); - trackerImportService.importTracker(params); + trackerImportService.importTracker(params, trackerObjects); - params = fromJson("tracker/one_update_and_one_new_and_one_invalid_event.json"); + trackerObjects = fromJson("tracker/one_update_and_one_new_and_one_invalid_event.json"); params.setUserId(userA.getUid()); params.setAtomicMode(AtomicMode.OBJECT); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport trackerImportEventReport = trackerImportService.importTracker(params); + ImportReport trackerImportEventReport = + trackerImportService.importTracker(params, trackerObjects); assertNotNull(trackerImportEventReport); assertEquals(Status.OK, trackerImportEventReport.getStatus()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java index b5d2f85398d7..b5c6e904bbf9 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeTest.java @@ -41,8 +41,10 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheatService; import org.hisp.dhis.tracker.imports.report.ImportReport; @@ -70,8 +72,10 @@ protected void initTest() throws IOException { @Test void testTrackedAttributePreheater() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_with_tea_data.json"); - TrackerPreheat preheat = trackerPreheatService.preheat(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/te_with_tea_data.json"); + TrackerPreheat preheat = + trackerPreheatService.preheat( + trackerObjects, new TrackerIdSchemeParams(), userService.getUser(ADMIN_USER_UID)); assertNotNull(preheat.get(OrganisationUnit.class, "cNEZTkdAvmg")); assertNotNull(preheat.get(TrackedEntityType.class, "KrYIdvLxkMb")); assertNotNull(preheat.get(TrackedEntityAttribute.class, "sYn3tkL3XKa")); @@ -81,8 +85,9 @@ void testTrackedAttributePreheater() throws IOException { @Test void testTrackedAttributeValueBundleImporter() throws IOException { - ImportReport importReport = - trackerImportService.importTracker(fromJson("tracker/te_with_tea_data.json")); + TrackerObjects trackerObjects = fromJson("tracker/te_with_tea_data.json"); + TrackerImportParams params = TrackerImportParams.builder().build(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java index bbc7722dc71a..dd59653ea493 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityAttributeValueAuditTest.java @@ -46,6 +46,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -71,7 +72,8 @@ protected void initTest() throws IOException { @Test void testTrackedEntityAttributeValueAuditCreate() throws IOException { assertNoErrors( - trackerImportService.importTracker(fromJson("tracker/te_program_with_tea_data.json"))); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/te_program_with_tea_data.json"))); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(1, trackedEntities.size()); @@ -95,9 +97,10 @@ void testTrackedEntityAttributeValueAuditCreate() throws IOException { @Test void testTrackedEntityAttributeValueAuditDelete() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); + TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List attributeValues1 = trackedEntityAttributeValueService.getTrackedEntityAttributeValues( @@ -106,9 +109,9 @@ void testTrackedEntityAttributeValueAuditDelete() throws IOException { attributeValues1.stream() .map(TrackedEntityAttributeValue::getAttribute) .collect(Collectors.toList()); - trackerImportParams = fromJson("tracker/te_program_with_tea_null_data.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/te_program_with_tea_null_data.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); List attributeValueAudits = diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java index fd8935c6ea60..a90f2ee01e9a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityDataValueAuditTest.java @@ -43,6 +43,7 @@ import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueAudit; import org.hisp.dhis.trackedentitydatavalue.TrackedEntityDataValueAuditService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -77,15 +78,16 @@ protected void initTest() throws IOException { @Test void testTrackedEntityDataValueAuditCreate() throws IOException { + TrackerImportParams params = new TrackerImportParams(); assertNoErrors( trackerImportService.importTracker( - fromJson("tracker/event_and_enrollment_with_data_values.json"))); + params, fromJson("tracker/event_and_enrollment_with_data_values.json"))); assertNoErrors( trackerImportService.importTracker( - fromJson("tracker/event_with_data_values_for_update_audit.json"))); + params, fromJson("tracker/event_with_data_values_for_update_audit.json"))); assertNoErrors( trackerImportService.importTracker( - fromJson("tracker/event_with_data_values_for_delete_audit.json"))); + params, fromJson("tracker/event_with_data_values_for_delete_audit.json"))); dataElement = manager.search(DataElement.class, DE); event = manager.search(Event.class, PSI); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java index 875ff64b62b5..3c3c8dee2e8e 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeEncryptionTest.java @@ -38,6 +38,7 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; @@ -68,6 +69,7 @@ protected void initTest() throws IOException { void testTrackedEntityProgramAttributeEncryptedValue() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/te_program_with_tea_encryption_data.json")); assertNoErrors(importReport); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java index 825b17d073e2..5338a1ddaee6 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeFileResourceTest.java @@ -43,6 +43,7 @@ import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValue; import org.hisp.dhis.trackedentityattributevalue.TrackedEntityAttributeValueService; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; @@ -82,6 +83,7 @@ void testTrackedEntityProgramAttributeFileResourceValue() throws IOException { assertFalse(fileResource.isAssigned()); ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/te_program_with_tea_fileresource_data.json")); assertNoErrors(importReport); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java index 1bd7a6209887..2a0d63d8c3d4 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackedEntityProgramAttributeTest.java @@ -40,6 +40,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -63,8 +64,9 @@ protected void initTest() throws IOException { @Test void testTrackedEntityProgramAttributeValue() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -77,8 +79,9 @@ void testTrackedEntityProgramAttributeValue() throws IOException { @Test void testTrackedEntityProgramAttributeValueUpdate() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -89,9 +92,9 @@ void testTrackedEntityProgramAttributeValueUpdate() throws IOException { assertEquals(5, attributeValues.size()); manager.clear(); // update - trackerImportParams = fromJson("tracker/te_program_with_tea_update_data.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/te_program_with_tea_update_data.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); trackedEntities = manager.getAll(TrackedEntity.class); @@ -104,8 +107,9 @@ void testTrackedEntityProgramAttributeValueUpdate() throws IOException { @Test void testTrackedEntityProgramAttributeValueUpdateAndDelete() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/te_program_with_tea_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/te_program_with_tea_data.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -116,9 +120,9 @@ void testTrackedEntityProgramAttributeValueUpdateAndDelete() throws IOException assertEquals(5, attributeValues.size()); manager.clear(); // update - trackerImportParams = fromJson("tracker/te_program_with_tea_update_data.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/te_program_with_tea_update_data.json"); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); trackedEntities = manager.getAll(TrackedEntity.class); @@ -129,9 +133,9 @@ void testTrackedEntityProgramAttributeValueUpdateAndDelete() throws IOException assertEquals(5, attributeValues.size()); manager.clear(); // delete - trackerImportParams = fromJson("tracker/te_program_with_tea_delete_data.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.DELETE); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/te_program_with_tea_delete_data.json"); + params.setImportStrategy(TrackerImportStrategy.DELETE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); trackedEntities = manager.getAll(TrackedEntity.class); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java index 3519956be68b..85f96e5a0bce 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerBundleServiceTest.java @@ -39,6 +39,7 @@ import org.hisp.dhis.trackedentity.TrackedEntity; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -67,9 +68,11 @@ void testVerifyMetadata() { @Test void testTrackedEntityImport() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/trackedentity_basic_data.json"); - assertEquals(13, trackerImportParams.getTrackedEntities().size()); - TrackerBundle trackerBundle = trackerBundleService.create(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/trackedentity_basic_data.json"); + assertEquals(13, trackerObjects.getTrackedEntities().size()); + TrackerBundle trackerBundle = + trackerBundleService.create( + new TrackerImportParams(), trackerObjects, userService.getUser(ADMIN_USER_UID)); trackerBundleService.commit(trackerBundle); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(13, trackedEntities.size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java index b67f6fcc79fd..36acc0dc557c 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerEventBundleServiceTest.java @@ -38,6 +38,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -58,9 +59,10 @@ protected void initTest() throws IOException { @Test void testCreateSingleEventData() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/event_events_and_enrollment.json"); - assertEquals(8, trackerImportParams.getEvents().size()); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/event_events_and_enrollment.json"); + assertEquals(8, trackerObjects.getEvents().size()); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); List events = eventStore.getAll(); @@ -69,13 +71,15 @@ void testCreateSingleEventData() throws IOException { @Test void testUpdateSingleEventData() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/event_events_and_enrollment.json"); + TrackerObjects trackerObjects = fromJson("tracker/event_events_and_enrollment.json"); + TrackerImportParams trackerImportParams = new TrackerImportParams(); trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(trackerImportParams, trackerObjects); assertNoErrors(importReport); assertEquals(8, eventStore.getAll().size()); - importReport = trackerImportService.importTracker(trackerImportParams); + importReport = trackerImportService.importTracker(trackerImportParams, trackerObjects); assertNoErrors(importReport); assertEquals(8, eventStore.getAll().size()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java index 17ecd943bbc5..f548deddc7e6 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerProgramRuleBundleServiceTest.java @@ -40,6 +40,7 @@ import org.hisp.dhis.programrule.ProgramRuleService; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -70,9 +71,11 @@ protected void initTest() throws IOException { @Test void testRunRuleEngineForEventOnBundleCreate() throws IOException { - TrackerImportParams trackerImportParams = fromJson("tracker/event_events_and_enrollment.json"); - assertEquals(8, trackerImportParams.getEvents().size()); - TrackerBundle trackerBundle = trackerBundleService.create(trackerImportParams); + TrackerObjects trackerObjects = fromJson("tracker/event_events_and_enrollment.json"); + assertEquals(8, trackerObjects.getEvents().size()); + TrackerBundle trackerBundle = + trackerBundleService.create( + new TrackerImportParams(), trackerObjects, userService.getUser(ADMIN_USER_UID)); trackerBundle = trackerBundleService.runRuleEngine(trackerBundle); assertEquals(trackerBundle.getEvents().size(), trackerBundle.getEventRuleEffects().size()); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java index 91bf43adb2f4..373b53f17c34 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/bundle/TrackerSideEffectHandlerServiceTest.java @@ -36,6 +36,7 @@ import org.hisp.dhis.common.IdentifiableObjectManager; import org.hisp.dhis.program.notification.ProgramNotificationInstance; import org.hisp.dhis.tracker.TrackerTest; +import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Disabled; @@ -61,6 +62,7 @@ protected void initTest() throws IOException { void testRuleEngineSideEffectHandlerService() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/enrollment_data_with_program_rule_side_effects.json")); assertNoErrors(importReport); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java index c77a08a2de31..2d6d3a54558a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatIdentifiersTest.java @@ -30,7 +30,6 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.hisp.dhis.tracker.imports.TrackerIdSchemeParams.builder; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -54,10 +53,11 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.DataValue; import org.hisp.dhis.tracker.imports.domain.Event; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.user.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -69,9 +69,12 @@ class TrackerPreheatIdentifiersTest extends TrackerTest { @Autowired private IdentifiableObjectManager manager; + private User user; + @Override protected void initTest() throws IOException { setUpMetadata("tracker/identifier_metadata.json"); + user = currentUserService.getCurrentUser(); } @Test @@ -81,9 +84,10 @@ void testOrgUnitIdentifiers() { String id = pair.getLeft(); TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().orgUnit(param.toMetadataIdentifier(id)).build(); - TrackerImportParams params = buildParams(event, builder().orgUnitIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = TrackerIdSchemeParams.builder().orgUnitIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, OrganisationUnit.class, param, id); } @@ -96,10 +100,11 @@ void testProgramStageIdentifiers() { String id = pair.getLeft(); TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().programStage(param.toMetadataIdentifier(id)).build(); - TrackerImportParams params = - buildParams(event, builder().programStageIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder().programStageIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, ProgramStage.class, param, id); } @@ -118,9 +123,11 @@ void testDataElementIdentifiers() { .programStage(MetadataIdentifier.ofUid("NpsdDv6kKSO")) .dataValues(Collections.singleton(dv1)) .build(); - TrackerImportParams params = buildParams(event, builder().dataElementIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder().dataElementIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, DataElement.class, param, id); } @@ -134,10 +141,11 @@ void testCategoryOptionIdentifiers() { TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().attributeCategoryOptions(Set.of(param.toMetadataIdentifier(id))).build(); - TrackerImportParams params = - buildParams(event, builder().categoryOptionIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder().categoryOptionIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, CategoryOption.class, param, id); } @@ -150,10 +158,11 @@ void testCategoryOptionComboIdentifiers() { String id = pair.getLeft(); TrackerIdSchemeParam param = pair.getRight(); Event event = Event.builder().attributeOptionCombo(param.toMetadataIdentifier(id)).build(); - TrackerImportParams params = - buildParams(event, builder().categoryOptionComboIdScheme(param).build()); + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(event)).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder().categoryOptionComboIdScheme(param).build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatedObjectExists(preheat, CategoryOptionCombo.class, param, id); } @@ -162,10 +171,10 @@ void testCategoryOptionComboIdentifiers() { @Test void testDefaultsWithIdSchemeUID() { - TrackerImportParams params = - TrackerImportParams.builder().user(currentUserService.getCurrentUser()).build(); + TrackerObjects trackerObjects = TrackerObjects.builder().build(); + TrackerIdSchemeParams params = TrackerIdSchemeParams.builder().build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatHasDefault(preheat, Category.class); assertPreheatHasDefault(preheat, CategoryCombo.class); @@ -175,20 +184,15 @@ void testDefaultsWithIdSchemeUID() { @Test void testDefaultsWithIdSchemesOtherThanUID() { + TrackerObjects trackerObjects = TrackerObjects.builder().events(List.of(new Event())).build(); + TrackerIdSchemeParams params = + TrackerIdSchemeParams.builder() + .idScheme(TrackerIdSchemeParam.NAME) + .categoryOptionIdScheme(TrackerIdSchemeParam.ofAttribute(CodeGenerator.generateUid())) + .categoryOptionComboIdScheme(TrackerIdSchemeParam.CODE) + .build(); - Event event = new Event(); - - TrackerImportParams params = - buildParams( - event, - builder() - .idScheme(TrackerIdSchemeParam.NAME) - .categoryOptionIdScheme( - TrackerIdSchemeParam.ofAttribute(CodeGenerator.generateUid())) - .categoryOptionComboIdScheme(TrackerIdSchemeParam.CODE) - .build()); - - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = trackerPreheatService.preheat(trackerObjects, params, user); assertPreheatHasDefault(preheat, Category.class); assertPreheatHasDefault(preheat, CategoryCombo.class); @@ -196,16 +200,6 @@ void testDefaultsWithIdSchemesOtherThanUID() { assertPreheatHasDefault(preheat, CategoryOptionCombo.class); } - private TrackerImportParams buildParams(Event event, TrackerIdSchemeParams idParams) { - TrackerImportParams params = - TrackerImportParams.builder() - .events(Collections.singletonList(event)) - .user(currentUserService.getCurrentUser()) - .idSchemes(idParams) - .build(); - return params; - } - private List> buildDataSet( String uid, String code, String name) { List> data = new ArrayList<>(); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java index 5f3f45d3f588..78ba1fa1b5c6 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceIntegrationTest.java @@ -45,10 +45,10 @@ import org.hisp.dhis.trackedentity.TrackedEntityTypeService; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.Enrollment; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; import org.junit.jupiter.api.Test; @@ -120,20 +120,21 @@ void testPreheatWithDifferentIdSchemes() { .trackedEntity("TE123456789") .build(); - TrackerImportParams params = - TrackerImportParams.builder() - .user(currentUser) + TrackerObjects trackerObjects = + TrackerObjects.builder() .trackedEntities(Lists.newArrayList(teA)) .enrollments(Lists.newArrayList(enrollmentA)) - .idSchemes( - TrackerIdSchemeParams.builder() - .idScheme(TrackerIdSchemeParam.UID) - .orgUnitIdScheme(TrackerIdSchemeParam.CODE) - .programIdScheme(TrackerIdSchemeParam.ofAttribute(ATTRIBUTE_UID)) - .build()) .build(); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerIdSchemeParams idSchemeParams = + TrackerIdSchemeParams.builder() + .idScheme(TrackerIdSchemeParam.UID) + .orgUnitIdScheme(TrackerIdSchemeParam.CODE) + .programIdScheme(TrackerIdSchemeParam.ofAttribute(ATTRIBUTE_UID)) + .build(); + + TrackerPreheat preheat = + trackerPreheatService.preheat(trackerObjects, idSchemeParams, currentUser); assertNotNull(preheat); // asserting on specific fields instead of plain assertEquals since diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java index 4cfaa53f987a..b17a4517f57b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/preheat/TrackerPreheatServiceTest.java @@ -42,12 +42,11 @@ import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.ProgramStage; import org.hisp.dhis.tracker.TrackerTest; -import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerIdentifierCollector; -import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.domain.MetadataIdentifier; import org.hisp.dhis.tracker.imports.domain.TrackedEntity; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -65,11 +64,11 @@ protected void initTest() {} @Test void testCollectIdentifiersEvents() throws IOException { - TrackerImportParams params = fromJson("tracker/event_events.json"); - assertTrue(params.getTrackedEntities().isEmpty()); - assertTrue(params.getEnrollments().isEmpty()); - assertFalse(params.getEvents().isEmpty()); - Map, Set> collectedMap = identifierCollector.collect(params); + TrackerObjects trackerObjects = fromJson("tracker/event_events.json"); + assertTrue(trackerObjects.getTrackedEntities().isEmpty()); + assertTrue(trackerObjects.getEnrollments().isEmpty()); + assertFalse(trackerObjects.getEvents().isEmpty()); + Map, Set> collectedMap = identifierCollector.collect(trackerObjects); assertTrue(collectedMap.containsKey(DataElement.class)); assertTrue(collectedMap.containsKey(ProgramStage.class)); assertTrue(collectedMap.containsKey(OrganisationUnit.class)); @@ -103,12 +102,8 @@ void testCollectIdentifiersEvents() throws IOException { @Test void testCollectIdentifiersAttributeValues() { - TrackerImportParams params = - TrackerImportParams.builder() - .idSchemes( - TrackerIdSchemeParams.builder() - .idScheme(TrackerIdSchemeParam.ofAttribute("ATTR1234567")) - .build()) + TrackerObjects trackerObjects = + TrackerObjects.builder() .trackedEntities( Lists.newArrayList( TrackedEntity.builder() @@ -116,10 +111,10 @@ void testCollectIdentifiersAttributeValues() { .orgUnit(MetadataIdentifier.ofCode("OU123456789")) .build())) .build(); - assertFalse(params.getTrackedEntities().isEmpty()); - assertTrue(params.getEnrollments().isEmpty()); - assertTrue(params.getEvents().isEmpty()); - Map, Set> collectedMap = identifierCollector.collect(params); + assertFalse(trackerObjects.getTrackedEntities().isEmpty()); + assertTrue(trackerObjects.getEnrollments().isEmpty()); + assertTrue(trackerObjects.getEvents().isEmpty()); + Map, Set> collectedMap = identifierCollector.collect(trackerObjects); assertTrue(collectedMap.containsKey(TrackedEntity.class)); Set trackedEntities = collectedMap.get(TrackedEntity.class); assertTrue(collectedMap.containsKey(OrganisationUnit.class)); @@ -132,21 +127,20 @@ void testCollectIdentifiersAttributeValues() { @Test void testPreheatValidation() throws IOException { - TrackerImportParams params = fromJson("tracker/event_events.json"); - assertTrue(params.getTrackedEntities().isEmpty()); - assertTrue(params.getEnrollments().isEmpty()); - assertFalse(params.getEvents().isEmpty()); + TrackerObjects trackerObjects = fromJson("tracker/event_events.json"); + assertTrue(trackerObjects.getTrackedEntities().isEmpty()); + assertTrue(trackerObjects.getEnrollments().isEmpty()); + assertFalse(trackerObjects.getEvents().isEmpty()); } @Test void testPreheatEvents() throws IOException { setUpMetadata("tracker/event_metadata.json"); - TrackerImportParams params = fromJson("tracker/event_events.json"); - assertTrue(params.getTrackedEntities().isEmpty()); - assertTrue(params.getEnrollments().isEmpty()); - assertFalse(params.getEvents().isEmpty()); + TrackerObjects trackerObjects = fromJson("tracker/event_events.json"); - TrackerPreheat preheat = trackerPreheatService.preheat(params); + TrackerPreheat preheat = + trackerPreheatService.preheat( + trackerObjects, new TrackerIdSchemeParams(), userService.getUser(ADMIN_USER_UID)); assertNotNull(preheat); assertFalse(preheat.getAll(DataElement.class).isEmpty()); diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java index e33d41b7760a..3d27f7cd4b68 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleAssignActionTest.java @@ -52,6 +52,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -86,28 +87,31 @@ public void initTest() throws IOException { assignProgramRule(); trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_completed_event.json")); } @Test void shouldImportWithWarningWhenDataElementWithSameValueIsAssignedByAssignRule() throws IOException { - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/programrule/event_update_datavalue_same_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyWarnings(importReport, E1308); } @Test void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() throws IOException { - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/programrule/event_update_datavalue_different_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, E1307); } @@ -117,11 +121,12 @@ void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() th shouldImportWithWarningWhenDataElementWithDifferentValueIsAssignedByAssignRuleAndOverwriteKeyIsTrue() throws IOException { systemSettingManager.saveSystemSetting(SettingKey.RULE_ENGINE_ASSIGN_OVERWRITE, true); - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/programrule/event_update_datavalue_different_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyWarnings(importReport, E1308); } @@ -131,11 +136,12 @@ void shouldNotImportWhenDataElementWithDifferentValueIsAssignedByAssignRule() th shouldImportWithWarningWhenDataElementWithDifferentAndEmptyValueIsAssignedByAssignRuleAndOverwriteKeyIsTrue() throws IOException { systemSettingManager.saveSystemSetting(SettingKey.RULE_ENGINE_ASSIGN_OVERWRITE, true); - TrackerImportParams params = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/programrule/event_update_datavalue_empty_value.json"); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyWarnings(importReport, E1308); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java index 484ca72cfc65..44e00dbd3e3a 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/programrule/ProgramRuleTest.java @@ -55,6 +55,7 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.validation.ValidationCode; import org.junit.jupiter.api.Test; @@ -111,7 +112,8 @@ public void initTest() throws IOException { @Test void shouldImportEnrollmentWithNoWarningsWhenThereAreNoProgramRules() throws IOException { ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertNoErrorsAndNoWarnings(report); } @@ -120,7 +122,8 @@ void shouldImportEnrollmentWithNoWarningsWhenThereAreNoProgramRules() throws IOE void shouldImportEnrollmentWithWarningsWhenAWarningIsTriggered() throws IOException { alwaysTrueWarningProgramRule(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertHasOnlyWarnings(report, E1300); } @@ -129,7 +132,8 @@ void shouldImportEnrollmentWithWarningsWhenAWarningIsTriggered() throws IOExcept void shouldNotImportEnrollmentWhenAnErrorIsTriggered() throws IOException { alwaysTrueErrorProgramRule(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertHasOnlyErrors(report, E1300); } @@ -138,7 +142,8 @@ void shouldNotImportEnrollmentWhenAnErrorIsTriggered() throws IOException { void shouldImportProgramEventWithWarningsWhenAWarningIsTriggered() throws IOException { alwaysTrueWarningProgramEventProgramRule(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/program_event.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/program_event.json")); assertHasOnlyWarnings(report, E1300); } @@ -148,7 +153,8 @@ void shouldNotImportProgramEventWhenAnErrorIsTriggeredBasedOnConditionEvaluating throws IOException { conditionWithConstantEvaluatesToTrue(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/program_event.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/program_event.json")); assertHasOnlyErrors(report, E1300); } @@ -157,7 +163,8 @@ void shouldNotImportProgramEventWhenAnErrorIsTriggeredBasedOnConditionEvaluating void shouldNotImportProgramEventWhenAnErrorIsTriggered() throws IOException { alwaysTrueErrorProgramEventProgramRule(); ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/program_event.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/program_event.json")); assertHasOnlyErrors(report, E1300); } @@ -166,6 +173,7 @@ void shouldNotImportProgramEventWhenAnErrorIsTriggered() throws IOException { void shouldImportEventWithNoWarningsWhenThereAreNoProgramRules() throws IOException { ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_completed_event.json")); assertNoErrorsAndNoWarnings(report); @@ -174,11 +182,14 @@ void shouldImportEventWithNoWarningsWhenThereAreNoProgramRules() throws IOExcept @Test void shouldImportEventWithWarningsWhenAWarningIsTriggered() throws IOException { ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertNoErrors(report); alwaysTrueWarningProgramRule(); - report = trackerImportService.importTracker(fromJson("tracker/programrule/event.json")); + report = + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/event.json")); assertHasOnlyWarnings(report, E1300); } @@ -186,11 +197,14 @@ void shouldImportEventWithWarningsWhenAWarningIsTriggered() throws IOException { @Test void shouldNotImportEventWhenAnErrorIsTriggered() throws IOException { ImportReport report = - trackerImportService.importTracker(fromJson("tracker/programrule/tei_enrollment.json")); + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment.json")); assertNoErrors(report); alwaysTrueErrorProgramRule(); - report = trackerImportService.importTracker(fromJson("tracker/programrule/event.json")); + report = + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/event.json")); assertHasOnlyErrors(report, E1300); } @@ -201,6 +215,7 @@ void shouldNotValidateEventAndValidateEnrollmentWhenAnErrorIsTriggeredOnEvent() onCompleteErrorProgramRule(); ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_completed_event.json")); assertHasOnlyErrors(report, E1300); @@ -211,6 +226,7 @@ void shouldNotImportEventAndEnrollmentWhenAnErrorIsTriggeredOnEnrollment() throw onCompleteErrorProgramRule(); ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_completed_enrollment_event.json")); assertAll( @@ -222,11 +238,14 @@ void shouldNotImportEventAndEnrollmentWhenAnErrorIsTriggeredOnEnrollment() throw void shouldImportEventWhenAnErrorIsTriggeredOnEnrollmentAlreadyPresentInDB() throws IOException { ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_completed_enrollment.json")); assertNoErrorsAndNoWarnings(report); onCompleteErrorProgramRule(); - report = trackerImportService.importTracker(fromJson("tracker/programrule/event.json")); + report = + trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/event.json")); assertNoErrorsAndNoWarnings(report); } @@ -237,6 +256,7 @@ void shouldNotImportWhenErrorIsTriggeredOnAllEntities() throws IOException { alwaysTrueErrorProgramEventProgramRule(); ImportReport report = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/programrule/tei_enrollment_event_programevent.json")); assertAll( @@ -248,9 +268,10 @@ void shouldNotImportWhenErrorIsTriggeredOnAllEntities() throws IOException { @Test void shouldImportWithWarningWhenARuleWithASyntaxErrorIsTriggered() throws IOException { syntaxErrorRule(); - TrackerImportParams params = fromJson("tracker/programrule/tei_enrollment.json"); + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyWarnings(importReport, E1300); } @@ -259,10 +280,11 @@ void shouldImportWithWarningWhenARuleWithASyntaxErrorIsTriggered() throws IOExce void shouldImportWithWarningWhenAWarningIsTriggeredOnEventInSameProgramStage() throws IOException { programStageWarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment_completed_event.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyWarnings(importReport, E1300); } @@ -271,11 +293,12 @@ void shouldImportWithWarningWhenAWarningIsTriggeredOnEventInSameProgramStage() void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnEventInDifferentProgramStage() throws IOException { programStageWarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson( "tracker/programrule/tei_enrollment_completed_event_from_another_program_stage.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } @@ -284,10 +307,11 @@ void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnEventInDifferentProgramS void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnActiveEventInOnCompleteProgramStage() throws IOException { programStage2WarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment_event_from_another_program_stage.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } @@ -296,11 +320,12 @@ void shouldImportWithNoWarningsWhenAWarningIsTriggeredOnActiveEventInOnCompleteP void shouldImportWithWarningsWhenAWarningIsTriggeredOnCompletedEventInOnCompleteProgramStage() throws IOException { programStage2WarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson( "tracker/programrule/tei_enrollment_completed_event_from_another_program_stage.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyWarnings(importReport, E1300); } @@ -309,11 +334,12 @@ void shouldImportWithWarningsWhenAWarningIsTriggeredOnCompletedEventInOnComplete void shouldImportWithNoWarningsWhenAWarningIsTriggeredWithADataElementFromADifferentProgramStage() throws IOException { programStage2WrongDataElementWarningRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson( "tracker/programrule/tei_enrollment_completed_event_from_another_program_stage.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } @@ -321,10 +347,11 @@ void shouldImportWithNoWarningsWhenAWarningIsTriggeredWithADataElementFromADiffe @Test void shouldNotImportWithWhenDataElementHasValue() throws IOException { showErrorWhenVariableHasValueRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_completed_enrollment_event.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, E1300); } @@ -332,10 +359,11 @@ void shouldNotImportWithWhenDataElementHasValue() throws IOException { @Test void shouldImportWithNoWarningsWhenDataElementHasNoValue() throws IOException { showErrorWhenVariableHasValueRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment_event_with_no_data_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } @@ -343,10 +371,11 @@ void shouldImportWithNoWarningsWhenDataElementHasNoValue() throws IOException { @Test void shouldImportWithNoWarningsWhenDataElementHasNullValue() throws IOException { showErrorWhenVariableHasValueRule(); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/programrule/tei_enrollment_event_with_null_data_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrorsAndNoWarnings(importReport); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java index c724d547332e..56fa2c88b94b 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentAttrValidationTest.java @@ -36,6 +36,7 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -54,119 +55,130 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data_2.json"))); manager.flush(); } @Test void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_with_invalid_option_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1125); } @Test void successValidationWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_with_valid_option_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void testAttributesMissingUid() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-missing-uuid.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1075); } @Test void testAttributesMissingValues() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-missing-value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1076); } @Test void testAttributesMissingTeA() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-non-existing.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1006); } @Test void testAttributesMissingMandatory() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-missing-mandatory.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1018); } @Test void testAttributesUniquenessInSameTei() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr_same_tei.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void testAttributesUniquenessAlreadyInDB() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_te-data_3.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_te-data_3.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - params = fromJson("tracker/validations/enrollments_te_unique_attr_same_tei.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr_same_tei.json"); - importReport = trackerImportService.importTracker(params); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - params = fromJson("tracker/validations/enrollments_te_unique_attr_in_db.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr_in_db.json"); - importReport = trackerImportService.importTracker(params); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1064); } @Test void testAttributesUniquenessInDifferentTeis() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_te-data_3.json"); - assertNoErrors(trackerImportService.importTracker(params)); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_te-data_3.json"); + assertNoErrors(trackerImportService.importTracker(new TrackerImportParams(), trackerObjects)); manager.flush(); manager.clear(); - params = fromJson("tracker/validations/enrollments_te_unique_attr.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_unique_attr.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasErrors(importReport, 2, ValidationCode.E1064); } @Test void testAttributesOnlyProgramAttrAllowed() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-only-program-attr.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1019); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java index e66a95192ca9..9feb1f5ff0ad 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentImportValidationTest.java @@ -40,9 +40,11 @@ import org.hisp.dhis.program.EnrollmentService; import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.TrackerType; +import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheat; import org.hisp.dhis.tracker.imports.preheat.TrackerPreheatService; import org.hisp.dhis.tracker.imports.report.ImportReport; @@ -68,28 +70,33 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); manager.flush(); } @Test void testEnrollmentValidationOkAll() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void testPreheatOwnershipForSubsequentEnrollment() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - TrackerImportParams secondParams = + TrackerObjects secondTrackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - TrackerPreheat preheat = trackerPreheatService.preheat(secondParams); - secondParams + TrackerPreheat preheat = + trackerPreheatService.preheat( + secondTrackerObjects, new TrackerIdSchemeParams(), userService.getUser(ADMIN_USER_UID)); + secondTrackerObjects .getEnrollments() .forEach( e -> { @@ -113,31 +120,34 @@ void testDisplayIncidentDateTrueButDateValueIsInvalid() { @Test void testNoWriteAccessToOrg() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); User user = userService.getUser(USER_2); - params.setUser(user); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 4, ValidationCode.E1000); } @Test void testOnlyProgramAttributesAllowedOnEnrollments() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_error_non_program_attr.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasErrors(importReport, 3, ValidationCode.E1019); } @Test void testAttributesOk() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-data.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); assertEquals( @@ -153,45 +163,49 @@ void testAttributesOk() throws IOException { @Test void testDeleteCascadeEnrollments() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_attr-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_attr-data.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); manager.flush(); importEvents(); manager.flush(); - params = fromJson("tracker/validations/enrollments_te_attr-data.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_attr-data.json"); User user2 = userService.getUser(USER_4); - params.setUser(user2); + params.setUserId(user2.getUid()); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport trackerImportDeleteReport = trackerImportService.importTracker(params); + ImportReport trackerImportDeleteReport = + trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(trackerImportDeleteReport, ValidationCode.E1103, ValidationCode.E1091); } protected void importEvents() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/events-with-registration.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-registration.json"); + TrackerImportParams params = new TrackerImportParams(); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testActiveEnrollmentAlreadyExists() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_double-tei-enrollment_part1.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - TrackerImportParams trackerImportParams1 = + TrackerObjects trackerObjects2 = fromJson("tracker/validations/enrollments_double-tei-enrollment_part2.json"); - importReport = trackerImportService.importTracker(trackerImportParams1); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects2); ValidationReport validationResult = importReport.getValidationReport(); @@ -200,19 +214,21 @@ void testActiveEnrollmentAlreadyExists() throws IOException { @Test void testEnrollmentDeleteOk() throws IOException { - TrackerImportParams paramsCreate = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = trackerImportService.importTracker(paramsCreate); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - TrackerImportParams paramsDelete = + TrackerObjects deleteTrackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data-delete.json"); - paramsDelete.setImportStrategy(TrackerImportStrategy.DELETE); + params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReportDelete = trackerImportService.importTracker(paramsDelete); + ImportReport importReportDelete = + trackerImportService.importTracker(params, deleteTrackerObjects); assertNoErrors(importReportDelete); assertEquals(1, importReportDelete.getStats().getDeleted()); @@ -221,9 +237,11 @@ void testEnrollmentDeleteOk() throws IOException { /** Notes with no value are ignored */ @Test void testBadEnrollmentNoteNoValue() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_bad-note-no-value.json"); + TrackerObjects trackerObjects = + fromJson("tracker/validations/enrollments_bad-note-no-value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java index 650514afb414..3e5218410c38 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EnrollmentSecurityImportValidationTest.java @@ -53,6 +53,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -163,19 +164,21 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); } @Test void testNoWriteAccessToOrg() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); User user = userService.getUser(USER_2); injectSecurityContext(user); - params.setUser(user); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 4, ValidationCode.E1000); } @@ -193,11 +196,12 @@ void testUserNoAccessToTrackedEntity() throws IOException { createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); userService.addUser(user); injectSecurityContext(user); - TrackerImportParams params = fromJson("tracker/validations/enrollments_no-access-tei.json"); - params.setUser(user); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_no-access-tei.json"); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1104); } @@ -219,11 +223,13 @@ void testUserNoWriteAccessToProgram() throws IOException { createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); userService.addUser(user); injectSecurityContext(user); - TrackerImportParams params = fromJson("tracker/validations/enrollments_no-access-program.json"); - params.setUser(user); + TrackerObjects trackerObjects = + fromJson("tracker/validations/enrollments_no-access-program.json"); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1091); } @@ -241,11 +247,13 @@ void testUserHasWriteAccessToProgram() throws IOException { createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); userService.addUser(user); injectSecurityContext(user); - TrackerImportParams params = fromJson("tracker/validations/enrollments_no-access-program.json"); - params.setUser(user); + TrackerObjects trackerObjects = + fromJson("tracker/validations/enrollments_no-access-program.json"); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @@ -262,12 +270,13 @@ void testUserHasNoAccessToProgramTeiType() throws IOException { User user = createUserWithAuth("user1").setOrganisationUnits(Sets.newHashSet(organisationUnitA)); injectSecurityContext(user); - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_program-teitype-missmatch.json"); - params.setUser(user); + TrackerImportParams params = new TrackerImportParams(); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1104); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java index 6faf730c1010..97701106ae92 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventImportValidationTest.java @@ -59,6 +59,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.TrackerTypeReport; import org.hisp.dhis.user.User; @@ -85,9 +86,11 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_enrollments-data.json"))); } @@ -95,6 +98,7 @@ protected void initTest() throws IOException { void testInvalidEnrollmentPreventsValidEventFromBeingCreated() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/invalid_enrollment_with_valid_event.json")); assertHasOnlyErrors(importReport, ValidationCode.E1070, ValidationCode.E5000); @@ -104,6 +108,7 @@ void testInvalidEnrollmentPreventsValidEventFromBeingCreated() throws IOExceptio void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-with_invalid_option_value.json")); assertHasOnlyErrors(importReport, ValidationCode.E1125); @@ -113,6 +118,7 @@ void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOExce void successWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-with_valid_option_value.json")); assertNoErrors(importReport); @@ -122,6 +128,7 @@ void successWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { void testEventValidationOkAll() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-with-registration.json")); assertNoErrors(importReport); @@ -131,6 +138,7 @@ void testEventValidationOkAll() throws IOException { void testEventValidationOkWithoutAttributeOptionCombo() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-without-attribute-option-combo.json")); assertNoErrors(importReport); @@ -138,24 +146,24 @@ void testEventValidationOkWithoutAttributeOptionCombo() throws IOException { @Test void testTrackerAndProgramEventUpdateSuccess() throws IOException { - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/program_and_tracker_events.json"); - assertNoErrors(trackerImportService.importTracker(trackerBundleParams)); + TrackerObjects trackerObjects = fromJson("tracker/validations/program_and_tracker_events.json"); + TrackerImportParams params = new TrackerImportParams(); + assertNoErrors(trackerImportService.importTracker(params, trackerObjects)); - trackerBundleParams.setImportStrategy(UPDATE); - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + params.setImportStrategy(UPDATE); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testCantWriteAccessCatCombo() throws IOException { - TrackerImportParams trackerImportParams = - fromJson("tracker/validations/events-cat-write-access.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-cat-write-access.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_6); - trackerImportParams.setUser(user); + params.setUserId(user.getUid()); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors( importReport, @@ -167,44 +175,45 @@ void testCantWriteAccessCatCombo() throws IOException { @Test void testNoWriteAccessToOrg() throws IOException { - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/events-with-registration.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-registration.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_2); - trackerBundleParams.setUser(user); - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + params.setUserId(user.getUid()); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1000); } @Test void testNonRepeatableProgramStage() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/events_non-repeatable-programstage_part1.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - trackerImportParams = - fromJson("tracker/validations/events_non-repeatable-programstage_part2.json"); + trackerObjects = fromJson("tracker/validations/events_non-repeatable-programstage_part2.json"); - importReport = trackerImportService.importTracker(trackerImportParams); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1039); } @Test void shouldSuccessfullyImportRepeatedEventsInEventProgram() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/program_events_non-repeatable-programstage_part1.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - trackerImportParams = + trackerObjects = fromJson("tracker/validations/program_events_non-repeatable-programstage_part2.json"); - importReport = trackerImportService.importTracker(trackerImportParams); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @@ -219,6 +228,7 @@ void testWrongScheduledDateString() { void testEventProgramHasNonDefaultCategoryCombo() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_non-default-combo.json")); assertHasOnlyErrors(importReport, ValidationCode.E1055); @@ -228,6 +238,7 @@ void testEventProgramHasNonDefaultCategoryCombo() throws IOException { void testCategoryOptionComboNotFound() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-cat-opt-combo.json")); assertHasOnlyErrors(importReport, ValidationCode.E1115); @@ -237,6 +248,7 @@ void testCategoryOptionComboNotFound() throws IOException { void testCategoryOptionComboNotFoundGivenSubsetOfCategoryOptions() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-aoc-with-subset-of-cos.json")); assertHasOnlyErrors(importReport, ValidationCode.E1117); @@ -246,6 +258,7 @@ void testCategoryOptionComboNotFoundGivenSubsetOfCategoryOptions() throws IOExce void testCOFoundButAOCNotFound() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-aoc-but-co-exists.json")); assertHasOnlyErrors(importReport, ValidationCode.E1115); @@ -255,6 +268,7 @@ void testCOFoundButAOCNotFound() throws IOException { void testCategoryOptionsNotFound() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_cant-find-cat-option.json")); assertHasOnlyErrors(importReport, ValidationCode.E1116); @@ -264,6 +278,7 @@ void testCategoryOptionsNotFound() throws IOException { void testAttributeCategoryOptionNotInProgramCC() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-aoc-not-in-program-cc.json")); assertHasOnlyErrors(importReport, ValidationCode.E1054); @@ -273,6 +288,7 @@ void testAttributeCategoryOptionNotInProgramCC() throws IOException { void testAttributeCategoryOptionAndCODoNotMatch() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events-aoc-and-co-dont-match.json")); assertHasOnlyErrors(importReport, ValidationCode.E1117); @@ -283,6 +299,7 @@ void testAttributeCategoryOptionCannotBeFoundForEventProgramCCAndGivenCategoryOp throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson( "tracker/validations/events_cant-find-cat-option-combo-for-given-cc-and-co.json")); @@ -293,6 +310,7 @@ void testAttributeCategoryOptionCannotBeFoundForEventProgramCCAndGivenCategoryOp void testWrongDatesInCatCombo() throws IOException { ImportReport importReport = trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/events_combo-date-wrong.json")); assertHasOnlyErrors(importReport, ValidationCode.E1056, ValidationCode.E1057); @@ -362,41 +380,43 @@ private void testDeletedEventFails(TrackerImportStrategy importStrategy) { assertNotNull(event); // When -> Soft-delete the event programStageServiceInstance.deleteEvent(event); - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/events-with-notes-data.json"); - trackerBundleParams.setImportStrategy(importStrategy); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-notes-data.json"); + TrackerImportParams params = new TrackerImportParams(); + params.setImportStrategy(importStrategy); // When - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1082); } @Test void testEventDeleteOk() throws IOException { - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/events-with-registration.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events-with-registration.json"); + TrackerImportParams params = new TrackerImportParams(); - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - TrackerImportParams paramsDelete = fromJson("tracker/validations/event-data-delete.json"); - paramsDelete.setImportStrategy(DELETE); + TrackerObjects deleteTrackerObjects = fromJson("tracker/validations/event-data-delete.json"); + params.setImportStrategy(DELETE); - ImportReport importReportDelete = trackerImportService.importTracker(paramsDelete); + ImportReport importReportDelete = + trackerImportService.importTracker(params, deleteTrackerObjects); assertNoErrors(importReportDelete); assertEquals(1, importReportDelete.getStats().getDeleted()); } private ImportReport createEvent(String jsonPayload) throws IOException { // Given - TrackerImportParams trackerBundleParams = fromJson(jsonPayload); - trackerBundleParams.setImportStrategy(CREATE_AND_UPDATE); + TrackerObjects trackerObjects = fromJson(jsonPayload); + TrackerImportParams params = new TrackerImportParams(); + params.setImportStrategy(CREATE_AND_UPDATE); // When - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); // Then assertNoErrors(importReport); return importReport; diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java index f870d492eb17..250bf1a50eb4 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/EventSecurityImportValidationTest.java @@ -63,6 +63,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserService; @@ -127,9 +128,11 @@ protected void initTest() throws IOException { injectAdminUser(); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_te-data.json"))); assertNoErrors( trackerImportService.importTracker( + new TrackerImportParams(), fromJson("tracker/validations/enrollments_te_enrollments-data.json"))); manager.flush(); } @@ -217,14 +220,14 @@ private void setupMetadata() { @Test void testNoWriteAccessToProgramStage() throws IOException { setupMetadata(); - TrackerImportParams trackerBundleParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/events_error-no-programStage-access.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_3); - trackerBundleParams.setUser(user); + params.setUserId(user.getUid()); user.addOrganisationUnit(organisationUnitA); manager.update(user); - trackerBundleParams.setUser(user); - ImportReport importReport = trackerImportService.importTracker(trackerBundleParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1095, ValidationCode.E1096); } @@ -232,16 +235,15 @@ void testNoWriteAccessToProgramStage() throws IOException { @Test void testNoUncompleteEventAuth() throws IOException { setupMetadata(); - TrackerImportParams params = fromJson("tracker/validations/events_error-no-uncomplete.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/events_error-no-uncomplete.json"); + TrackerImportParams params = new TrackerImportParams(); params.setImportStrategy(TrackerImportStrategy.CREATE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); // Change just inserted Event to status COMPLETED... Event zwwuwNp6gVd = programStageServiceInstance.getEvent("ZwwuwNp6gVd"); zwwuwNp6gVd.setStatus(EventStatus.COMPLETED); manager.update(zwwuwNp6gVd); - TrackerImportParams trackerBundleParams = - fromJson("tracker/validations/events_error-no-uncomplete.json"); programA.setPublicAccess(AccessStringHelper.FULL); manager.update(programA); programStageA.setPublicAccess(AccessStringHelper.FULL); @@ -253,9 +255,9 @@ void testNoUncompleteEventAuth() throws IOException { manager.update(user); manager.flush(); manager.clear(); - trackerBundleParams.setUserId(user.getUid()); - trackerBundleParams.setImportStrategy(TrackerImportStrategy.UPDATE); - importReport = trackerImportService.importTracker(trackerBundleParams); + params.setUserId(user.getUid()); + params.setImportStrategy(TrackerImportStrategy.UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1083); } } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java index f8bc741c6541..dcf6a55beaba 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaEncryptionValidationTest.java @@ -35,6 +35,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -50,32 +51,33 @@ protected void initTest() throws IOException { @Test void testUniqueFailInOrgUnit() throws IOException { - TrackerImportParams trackerImportParams = + TrackerImportParams params = new TrackerImportParams(); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data_in_country.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); - trackerImportParams = + trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data_in_country.json"); - trackerImportParams.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); - importReport = trackerImportService.importTracker(trackerImportParams); + params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); - trackerImportParams = - fromJson("tracker/validations/te-program_with_tea_unique_data_in_region.json"); - importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data_in_region.json"); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testUniqueFail() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); - trackerImportParams = fromJson("tracker/validations/te-program_with_tea_unique_data2.json"); + trackerObjects = fromJson("tracker/validations/te-program_with_tea_unique_data2.json"); - importReport = trackerImportService.importTracker(trackerImportParams); + importReport = trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1064); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java index ca60d780448d..f13c725ba1a7 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TeTaValidationTest.java @@ -45,6 +45,7 @@ import org.hisp.dhis.tracker.TrackerTest; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -80,9 +81,9 @@ void testTrackedEntityProgramAttributeFileResourceValue() throws IOException { File file = File.createTempFile("file-resource", "test"); fileResourceService.saveFileResource(fileResource, file); assertFalse(fileResource.isAssigned()); - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_fileresource_data.json"); - trackerImportService.importTracker(trackerImportParams); + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(1, trackedEntities.size()); TrackedEntity trackedEntity = trackedEntities.get(0); @@ -106,9 +107,9 @@ void testFileAlreadyAssign() throws IOException { File file = File.createTempFile("file-resource", "test"); fileResourceService.saveFileResource(fileResource, file); assertFalse(fileResource.isAssigned()); - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_fileresource_data.json"); - trackerImportService.importTracker(trackerImportParams); + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); List trackedEntities = manager.getAll(TrackedEntity.class); assertEquals(1, trackedEntities.size()); TrackedEntity trackedEntity = trackedEntities.get(0); @@ -117,17 +118,18 @@ void testFileAlreadyAssign() throws IOException { assertEquals(1, attributeValues.size()); fileResource = fileResourceService.getFileResource(fileResource.getUid()); assertTrue(fileResource.isAssigned()); - trackerImportParams = - fromJson("tracker/validations/te-program_with_tea_fileresource_data2.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + trackerObjects = fromJson("tracker/validations/te-program_with_tea_fileresource_data2.json"); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1009); } @Test void testNoFileRef() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_fileresource_data.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1084); List trackedEntities = manager.getAll(TrackedEntity.class); @@ -136,40 +138,44 @@ void testNoFileRef() throws IOException { @Test void testTeaMaxTextValueLength() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_too_long_text_value.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1077); } @Test void testTeaInvalidFormat() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_invalid_format_value.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1085); } @Test void testTeaInvalidImage() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_invalid_image_value.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1085, ValidationCode.E1007); } @Test void testTeaIsNull() throws IOException { - TrackerImportParams trackerImportParams = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-program_with_tea_invalid_value_isnull.json"); - ImportReport importReport = trackerImportService.importTracker(trackerImportParams); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1076); } diff --git a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java index a32b48287d1c..d5f62d263553 100644 --- a/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java +++ b/dhis-2/dhis-test-integration/src/test/java/org/hisp/dhis/tracker/imports/validation/TrackedEntityImportValidationTest.java @@ -45,6 +45,7 @@ import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; import org.hisp.dhis.tracker.imports.TrackerImportStrategy; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.user.User; import org.junit.jupiter.api.Test; @@ -66,47 +67,53 @@ protected void initTest() throws IOException { @Test void failValidationWhenTrackedEntityAttributeHasWrongOptionValue() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-with_invalid_option_value.json"); + TrackerObjects trackerObjects = + fromJson("tracker/validations/te-with_invalid_option_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1125); } @Test void successValidationWhenTrackedEntityAttributeHasValidOptionValue() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-with_valid_option_value.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-with_valid_option_value.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void failValidationWhenTrackedEntityAttributesHaveSameUniqueValues() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-with_unique_attributes.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-with_unique_attributes.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertHasErrors(importReport, 2, ValidationCode.E1064); } @Test void testTeValidationOkAll() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } @Test void testNoCreateTeiAccessOutsideCaptureScopeOu() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_7); - params.setUser(user); + params.setUserId(user.getUid()); params.setAtomicMode(AtomicMode.OBJECT); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1000); assertEquals(2, importReport.getStats().getCreated()); assertEquals(1, importReport.getStats().getIgnored()); @@ -114,8 +121,9 @@ void testNoCreateTeiAccessOutsideCaptureScopeOu() throws IOException { @Test void testUpdateAccessInSearchScopeOu() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertEquals(3, importReport.getStats().getCreated()); // For some reason teiSearchOrgunits is not created properly from @@ -125,29 +133,30 @@ void testUpdateAccessInSearchScopeOu() throws IOException { user.setTeiSearchOrganisationUnits(new HashSet<>(user.getDataViewOrganisationUnits())); userService.updateUser(user); dbmsManager.clearSession(); - params = fromJson("tracker/validations/te-data_with_different_ou.json"); + trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); user = userService.getUser(USER_8); - params.setUser(user); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); params.setAtomicMode(AtomicMode.OBJECT); - importReport = trackerImportService.importTracker(params); + importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertEquals(3, importReport.getStats().getUpdated()); } @Test void testNoUpdateAccessOutsideSearchScopeOu() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_with_different_ou.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); assertEquals(3, importReport.getStats().getCreated()); dbmsManager.clearSession(); - params = fromJson("tracker/validations/te-data_with_different_ou.json"); + trackerObjects = fromJson("tracker/validations/te-data_with_different_ou.json"); User user = userService.getUser(USER_7); - params.setUser(user); + params.setUserId(user.getUid()); params.setImportStrategy(TrackerImportStrategy.CREATE_AND_UPDATE); params.setAtomicMode(AtomicMode.OBJECT); - importReport = trackerImportService.importTracker(params); + importReport = trackerImportService.importTracker(params, trackerObjects); assertHasOnlyErrors(importReport, ValidationCode.E1003); assertEquals(2, importReport.getStats().getUpdated()); assertEquals(1, importReport.getStats().getIgnored()); @@ -155,81 +164,89 @@ void testNoUpdateAccessOutsideSearchScopeOu() throws IOException { @Test void testNoWriteAccessInAcl() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_ok.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_ok.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_1); - params.setUser(user); + params.setUserId(user.getUid()); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 13, ValidationCode.E1001); } @Test void testWriteAccessInAclViaUserGroup() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_ok.json"); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_ok.json"); + TrackerImportParams params = new TrackerImportParams(); User user = userService.getUser(USER_3); params.setUserId(user.getUid()); - params.setUser(user); + params.setUserId(user.getUid()); user.setPassword("user4password"); injectSecurityContext(user); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testGeoOk() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data_error_geo-ok.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_error_geo-ok.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); } @Test void testTeAttrNonExistentAttr() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data_error_attr-non-existing.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 2, ValidationCode.E1006); } @Test void testDeleteCascadeEnrollments() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/enrollments_te_te-data.json"); - assertNoErrors(trackerImportService.importTracker(params)); + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_te-data.json"); + TrackerImportParams params = new TrackerImportParams(); + assertNoErrors(trackerImportService.importTracker(params, trackerObjects)); importEnrollments(); manager.flush(); manager.clear(); - params = fromJson("tracker/validations/enrollments_te_te-data.json"); + trackerObjects = fromJson("tracker/validations/enrollments_te_te-data.json"); User user2 = userService.getUser(USER_4); - params.setUser(user2); + params.setUserId(user2.getUid()); params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertHasErrors(importReport, 2, ValidationCode.E1100); } @Test void testTeDeleteOk() throws IOException { - TrackerImportParams params = fromJson("tracker/validations/te-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + TrackerObjects trackerObjects = fromJson("tracker/validations/te-data.json"); + TrackerImportParams params = new TrackerImportParams(); + ImportReport importReport = trackerImportService.importTracker(params, trackerObjects); assertNoErrors(importReport); manager.flush(); manager.clear(); - TrackerImportParams paramsDelete = fromJson("tracker/validations/te-data-delete.json"); - paramsDelete.setImportStrategy(TrackerImportStrategy.DELETE); + TrackerObjects deleteTrackerObjects = fromJson("tracker/validations/te-data-delete.json"); + params.setImportStrategy(TrackerImportStrategy.DELETE); - ImportReport importReportDelete = trackerImportService.importTracker(paramsDelete); + ImportReport importReportDelete = + trackerImportService.importTracker(params, deleteTrackerObjects); assertNoErrors(importReportDelete); assertEquals(1, importReportDelete.getStats().getDeleted()); } protected void importEnrollments() throws IOException { - TrackerImportParams params = + TrackerObjects trackerObjects = fromJson("tracker/validations/enrollments_te_enrollments-data.json"); - ImportReport importReport = trackerImportService.importTracker(params); + ImportReport importReport = + trackerImportService.importTracker(new TrackerImportParams(), trackerObjects); assertNoErrors(importReport); } } diff --git a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java index d0a0837fe6bf..62d15b1863a8 100644 --- a/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java +++ b/dhis-2/dhis-test-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java @@ -28,7 +28,7 @@ package org.hisp.dhis.webapi.controller.tracker.imports; import org.hisp.dhis.web.HttpStatus; -import org.hisp.dhis.webapi.DhisControllerConvenienceTest; +import org.hisp.dhis.webapi.DhisControllerIntegrationTest; import org.junit.jupiter.api.Test; /** @@ -37,7 +37,7 @@ * * @author Jan Bernitt */ -class TrackerImportControllerTest extends DhisControllerConvenienceTest { +class TrackerImportControllerTest extends DhisControllerIntegrationTest { @Test void shouldSucceedWhenAllValidParametersArePassed() { assertWebMessage( diff --git a/dhis-2/dhis-web-api/pom.xml b/dhis-2/dhis-web-api/pom.xml index 6a0c8894417b..10823ccd10f0 100644 --- a/dhis-2/dhis-web-api/pom.xml +++ b/dhis-2/dhis-web-api/pom.xml @@ -214,10 +214,6 @@ org.hisp.dhis.rules rule-engine - - org.hisp.dhis - dhis-support-artemis - org.hisp.dhis dhis-service-acl diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/TrackedEntityInstanceController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/TrackedEntityInstanceController.java index 50f0b1fc0542..11a5d4704f32 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/TrackedEntityInstanceController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/deprecated/tracker/TrackedEntityInstanceController.java @@ -73,6 +73,7 @@ import org.hisp.dhis.dxf2.webmessage.WebMessage; import org.hisp.dhis.dxf2.webmessage.WebMessageException; import org.hisp.dhis.feedback.BadRequestException; +import org.hisp.dhis.feedback.ConflictException; import org.hisp.dhis.fieldfilter.FieldFilterParams; import org.hisp.dhis.fieldfilter.FieldFilterService; import org.hisp.dhis.fileresource.FileResource; @@ -205,7 +206,7 @@ public void getAttributeImage( @RequestParam(required = false) Integer height, @RequestParam(required = false) ImageFileDimension dimension, HttpServletResponse response) - throws WebMessageException { + throws WebMessageException, ConflictException { User user = currentUserService.getCurrentUser(); TrackedEntity trackedEntity = instanceService.getTrackedEntity(teiId); diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/metadata/MetadataImportJob.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/metadata/MetadataImportJob.java index 20c76b3ae303..1aaa4126861f 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/metadata/MetadataImportJob.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/metadata/MetadataImportJob.java @@ -82,7 +82,7 @@ public void execute(JobConfiguration config, JobProgress progress) { MetadataImportParams params = (MetadataImportParams) config.getJobParameters(); progress.startingStage("Loading file resource"); FileResource data = - progress.runStage(() -> fileResourceService.getFileResource(config.getUid())); + progress.runStage(() -> fileResourceService.getExistingFileResource(config.getUid())); progress.startingStage("Loading file content"); try (InputStream input = progress.runStage(() -> fileResourceService.getFileResourceContent(data))) { diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java index 6ab8f2d79861..b60d474a7065 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/Body.java @@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; import lombok.AllArgsConstructor; @@ -54,7 +55,7 @@ @NoArgsConstructor @AllArgsConstructor @JsonDeserialize(converter = BodyConverter.class) -class Body { +class Body implements Serializable { /** Tracked entities to import. */ @JsonProperty @Builder.Default private final List trackedEntities = new ArrayList<>(); diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java deleted file mode 100644 index 50ecec4368ad..000000000000 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerAsyncImporter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.webapi.controller.tracker.imports; - -import javax.annotation.Nonnull; -import lombok.RequiredArgsConstructor; -import org.hisp.dhis.artemis.MessageManager; -import org.hisp.dhis.artemis.Topics; -import org.hisp.dhis.security.AuthenticationSerializer; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.job.TrackerMessage; -import org.hisp.dhis.tracker.imports.report.ImportReport; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Component; - -/** - * @author Luca Cambi - */ -@Component -@RequiredArgsConstructor -public class TrackerAsyncImporter { - @Nonnull private final MessageManager messageManager; - - public ImportReport importTracker( - TrackerImportParams params, Authentication authentication, String uid) { - TrackerMessage trackerMessage = - TrackerMessage.builder() - .trackerImportParams(params) - .authentication(AuthenticationSerializer.serialize(authentication)) - .uid(uid) - .build(); - - messageManager.sendQueue(Topics.TRACKER_IMPORT_JOB_TOPIC_NAME, trackerMessage); - - return null; // empty report is not - // returned - // in async creation - } -} diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java index 2610b91c51ac..e882355a4df9 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportController.java @@ -32,28 +32,33 @@ import static org.hisp.dhis.webapi.utils.ContextUtils.setNoStore; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.ObjectOutputStream; import java.util.Deque; import java.util.List; import java.util.Optional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; -import org.hisp.dhis.common.CodeGenerator; import org.hisp.dhis.common.DhisApiVersion; import org.hisp.dhis.common.OpenApi; import org.hisp.dhis.commons.util.StreamUtils; import org.hisp.dhis.dxf2.webmessage.WebMessage; +import org.hisp.dhis.feedback.ConflictException; import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.scheduling.JobConfiguration; +import org.hisp.dhis.scheduling.JobConfigurationService; +import org.hisp.dhis.scheduling.JobSchedulerService; import org.hisp.dhis.scheduling.JobType; import org.hisp.dhis.system.notification.Notification; import org.hisp.dhis.system.notification.Notifier; import org.hisp.dhis.tracker.imports.TrackerBundleReportMode; import org.hisp.dhis.tracker.imports.TrackerImportParams; import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.job.TrackerJobWebMessageResponse; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.Status; import org.hisp.dhis.user.CurrentUser; @@ -65,7 +70,7 @@ import org.locationtech.jts.io.ParseException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.MimeType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -87,33 +92,60 @@ public class TrackerImportController { static final String TRACKER_JOB_ADDED = "Tracker job added"; - private final TrackerSyncImporter syncImporter; - - private final TrackerAsyncImporter asyncImporter; - private final TrackerImportService trackerImportService; private final CsvService csvEventService; private final Notifier notifier; + private final JobSchedulerService jobSchedulerService; + + private final JobConfigurationService jobConfigurationService; + @PostMapping(value = "", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) @ResponseBody public WebMessage asyncPostJsonTracker( HttpServletRequest request, RequestParams requestParams, @CurrentUser User currentUser, - @RequestBody Body body) { - String jobId = CodeGenerator.generateUid(); + @RequestBody Body body) + throws ConflictException, NotFoundException, IOException { TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams( - true, jobId, currentUser.getUid(), requestParams, body); + TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), requestParams); + TrackerObjects trackerObjects = + TrackerImportParamsMapper.trackerObjects(body, trackerImportParams.getIdSchemes()); + + return startAsyncTracker( + trackerImportParams, + MimeType.valueOf("application/json"), + trackerObjects, + currentUser, + request); + } - asyncImporter.importTracker( - trackerImportParams, SecurityContextHolder.getContext().getAuthentication(), jobId); + private WebMessage startAsyncTracker( + TrackerImportParams params, + MimeType contentType, + TrackerObjects trackerObjects, + User user, + HttpServletRequest request) + throws IOException, ConflictException, NotFoundException { + JobConfiguration config = new JobConfiguration(JobType.TRACKER_IMPORT_JOB); + config.setExecutedBy(user.getUid()); + config.setJobParameters(params); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); - String location = ContextUtils.getRootPath(request) + "/tracker/jobs/" + jobId; + oos.writeObject(trackerObjects); + + oos.flush(); + oos.close(); + InputStream is = new ByteArrayInputStream(baos.toByteArray()); + + jobSchedulerService.executeNow(jobConfigurationService.create(config, contentType, is)); + String jobId = config.getUid(); + String location = ContextUtils.getRootPath(request) + "/tracker/jobs/" + jobId; return ok(TRACKER_JOB_ADDED) .setLocation("/tracker/jobs/" + jobId) .setResponse(TrackerJobWebMessageResponse.builder().id(jobId).location(location).build()); @@ -125,12 +157,13 @@ public WebMessage asyncPostJsonTracker( params = {"async=false"}) public ResponseEntity syncPostJsonTracker( RequestParams requestParams, @CurrentUser User currentUser, @RequestBody Body body) { - String jobId = CodeGenerator.generateUid(); - TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams( - false, jobId, currentUser.getUid(), requestParams, body); - - ImportReport importReport = syncImporter.importTracker(trackerImportParams); + TrackerImportParams params = + TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), requestParams); + TrackerObjects trackerObjects = + TrackerImportParamsMapper.trackerObjects(body, params.getIdSchemes()); + ImportReport importReport = + trackerImportService.buildImportReport( + trackerImportService.importTracker(params, trackerObjects), params.getReportMode()); ResponseEntity.BodyBuilder builder = importReport.getStatus() == Status.ERROR @@ -150,26 +183,25 @@ public WebMessage asyncPostCsvTracker( RequestParams importRequest, @CurrentUser User currentUser, @RequestParam(required = false, defaultValue = "true") boolean skipFirst) - throws IOException, ParseException { + throws IOException, ParseException, ConflictException, NotFoundException { InputStream inputStream = StreamUtils.wrapAndCheckCompressionFormat(request.getInputStream()); List events = csvEventService.read(inputStream, skipFirst); Body body = Body.builder().events(events).build(); - String jobId = CodeGenerator.generateUid(); TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams( - true, jobId, currentUser.getUid(), importRequest, body); + TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), importRequest); - asyncImporter.importTracker( - trackerImportParams, SecurityContextHolder.getContext().getAuthentication(), jobId); - - String location = ContextUtils.getRootPath(request) + "/tracker/jobs/" + jobId; + TrackerObjects trackerObjects = + TrackerImportParamsMapper.trackerObjects(body, trackerImportParams.getIdSchemes()); - return ok(TRACKER_JOB_ADDED) - .setLocation("/tracker/jobs/" + jobId) - .setResponse(TrackerJobWebMessageResponse.builder().id(jobId).location(location).build()); + return startAsyncTracker( + trackerImportParams, + MimeType.valueOf("application/csv"), + trackerObjects, + currentUser, + request); } @PostMapping( @@ -189,12 +221,14 @@ public ResponseEntity syncPostCsvTracker( List events = csvEventService.read(inputStream, skipFirst); Body body = Body.builder().events(events).build(); - String jobId = CodeGenerator.generateUid(); TrackerImportParams trackerImportParams = - TrackerImportParamsMapper.trackerImportParams( - false, jobId, currentUser.getUid(), importRequest, body); - - ImportReport importReport = syncImporter.importTracker(trackerImportParams); + TrackerImportParamsMapper.trackerImportParams(currentUser.getUid(), importRequest); + TrackerObjects trackerObjects = + TrackerImportParamsMapper.trackerObjects(body, trackerImportParams.getIdSchemes()); + ImportReport importReport = + trackerImportService.buildImportReport( + trackerImportService.importTracker(trackerImportParams, trackerObjects), + trackerImportParams.getReportMode()); ResponseEntity.BodyBuilder builder = importReport.getStatus() == Status.ERROR @@ -221,6 +255,6 @@ public ImportReport getJobReport( return Optional.ofNullable(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)) .map(report -> trackerImportService.buildImportReport((ImportReport) report, reportMode)) - .orElseThrow(() -> new NotFoundException(JobConfiguration.class, uid)); + .orElseThrow(() -> new NotFoundException("Summary for job " + uid + " does not exist")); } } diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java new file mode 100644 index 000000000000..d144c60e0970 --- /dev/null +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportJob.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2004-2022, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.hisp.dhis.webapi.controller.tracker.imports; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.util.function.Consumer; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.hisp.dhis.fileresource.FileResource; +import org.hisp.dhis.fileresource.FileResourceService; +import org.hisp.dhis.scheduling.Job; +import org.hisp.dhis.scheduling.JobConfiguration; +import org.hisp.dhis.scheduling.JobProgress; +import org.hisp.dhis.scheduling.JobType; +import org.hisp.dhis.system.notification.Notifier; +import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.TrackerImportService; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; +import org.hisp.dhis.tracker.imports.report.ImportReport; +import org.hisp.dhis.tracker.imports.report.Stats; +import org.hisp.dhis.tracker.imports.report.Status; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class TrackerImportJob implements Job { + private final TrackerImportService trackerImportService; + private final FileResourceService fileResourceService; + private final Notifier notifier; + + @Override + public JobType getJobType() { + return JobType.TRACKER_IMPORT_JOB; + } + + @Override + public void execute(JobConfiguration config, JobProgress progress) { + progress.startingProcess("Tracker import started"); + TrackerImportParams params = (TrackerImportParams) config.getJobParameters(); + progress.startingStage("Loading file resource"); + FileResource data = + progress.runStage(() -> fileResourceService.getExistingFileResource(config.getUid())); + progress.startingStage("Loading file content"); + try (InputStream input = + progress.runStage(() -> fileResourceService.getFileResourceContent(data))) { + ImportReport report = + trackerImportService.importTracker(params, toTrackerObjects(input), progress); + if (report == null) { + progress.failedProcess("Import failed, no summary available"); + return; + } + notifier.addJobSummary(config, report, ImportReport.class); + Stats stats = report.getStats(); + Consumer endProcess = + report.getStatus() == Status.ERROR ? progress::failedProcess : progress::completedProcess; + endProcess.accept( + "Import complete with status %s, %d created, %d updated, %d deleted, %d ignored" + .formatted( + report.getStatus(), + stats.getCreated(), + stats.getUpdated(), + stats.getDeleted(), + stats.getIgnored())); + } catch (Exception ex) { + progress.failedProcess(ex); + } + } + + private TrackerObjects toTrackerObjects(InputStream input) + throws IOException, ClassNotFoundException { + ObjectInputStream ois = new ObjectInputStream(input); + return (TrackerObjects) ois.readObject(); + } +} diff --git a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java index 5eb64ff0609d..e1de076a1d4b 100644 --- a/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapper.java @@ -27,11 +27,10 @@ */ package org.hisp.dhis.webapi.controller.tracker.imports; -import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobType; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParam; import org.hisp.dhis.tracker.imports.TrackerIdSchemeParams; import org.hisp.dhis.tracker.imports.TrackerImportParams; +import org.hisp.dhis.tracker.imports.domain.TrackerObjects; import org.mapstruct.factory.Mappers; public class TrackerImportParamsMapper { @@ -46,10 +45,19 @@ public class TrackerImportParamsMapper { private static final RelationshipMapper RELATIONSHIP_MAPPER = Mappers.getMapper(RelationshipMapper.class); + public static TrackerObjects trackerObjects(Body body, TrackerIdSchemeParams idSchemeParams) { + return TrackerObjects.builder() + .trackedEntities( + TRACKED_ENTITY_MAPPER.fromCollection(body.getTrackedEntities(), idSchemeParams)) + .enrollments(ENROLLMENT_MAPPER.fromCollection(body.getEnrollments(), idSchemeParams)) + .events(EVENT_MAPPER.fromCollection(body.getEvents(), idSchemeParams)) + .relationships(RELATIONSHIP_MAPPER.fromCollection(body.getRelationships(), idSchemeParams)) + .build(); + } + private TrackerImportParamsMapper() {} - public static TrackerImportParams trackerImportParams( - boolean isAsync, String jobId, String userId, RequestParams request, Body params) { + public static TrackerImportParams trackerImportParams(String userId, RequestParams request) { TrackerIdSchemeParam defaultIdSchemeParam = request.getIdScheme(); TrackerIdSchemeParams idSchemeParams = TrackerIdSchemeParams.builder() @@ -77,21 +85,7 @@ public static TrackerImportParams trackerImportParams( .skipSideEffects(request.isSkipSideEffects()) .skipRuleEngine(request.isSkipRuleEngine()) .reportMode(request.getReportMode()) - .userId(userId) - .trackedEntities( - TRACKED_ENTITY_MAPPER.fromCollection(params.getTrackedEntities(), idSchemeParams)) - .enrollments(ENROLLMENT_MAPPER.fromCollection(params.getEnrollments(), idSchemeParams)) - .events(EVENT_MAPPER.fromCollection(params.getEvents(), idSchemeParams)) - .relationships( - RELATIONSHIP_MAPPER.fromCollection(params.getRelationships(), idSchemeParams)); - - if (!isAsync) { - JobConfiguration jobConfiguration = - new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, userId); - jobConfiguration.setUid(jobId); - paramsBuilder.jobConfiguration(jobConfiguration); - } - + .userId(userId); return paramsBuilder.build(); } diff --git a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerJobWebMessageResponse.java b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerJobWebMessageResponse.java similarity index 92% rename from dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerJobWebMessageResponse.java rename to dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerJobWebMessageResponse.java index 630f30f46e4a..3251757dc7ba 100644 --- a/dhis-2/dhis-services/dhis-service-tracker/src/main/java/org/hisp/dhis/tracker/imports/job/TrackerJobWebMessageResponse.java +++ b/dhis-2/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerJobWebMessageResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2022, University of Oslo + * Copyright (c) 2004-2023, University of Oslo * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,16 +25,13 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package org.hisp.dhis.tracker.imports.job; +package org.hisp.dhis.webapi.controller.tracker.imports; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Data; import org.hisp.dhis.webmessage.WebMessageResponse; -/** - * @author Morten Olav Hansen - */ @Data @Builder public class TrackerJobWebMessageResponse implements WebMessageResponse { diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java index acb52aa69679..67610dbe6e05 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportControllerTest.java @@ -29,6 +29,7 @@ import static java.util.Collections.singletonList; import static org.hamcrest.Matchers.hasSize; +import static org.hisp.dhis.scheduling.JobType.TRACKER_IMPORT_JOB; import static org.hisp.dhis.webapi.controller.tracker.imports.TrackerImportController.TRACKER_JOB_ADDED; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -50,7 +51,8 @@ import org.hisp.dhis.feedback.NotFoundException; import org.hisp.dhis.render.DefaultRenderService; import org.hisp.dhis.render.RenderService; -import org.hisp.dhis.scheduling.JobType; +import org.hisp.dhis.scheduling.JobConfigurationService; +import org.hisp.dhis.scheduling.JobSchedulerService; import org.hisp.dhis.schema.SchemaService; import org.hisp.dhis.system.notification.Notification; import org.hisp.dhis.system.notification.Notifier; @@ -58,7 +60,6 @@ import org.hisp.dhis.tracker.imports.report.ImportReport; import org.hisp.dhis.tracker.imports.report.PersistenceReport; import org.hisp.dhis.tracker.imports.report.Status; -import org.hisp.dhis.tracker.imports.report.TimingsStats; import org.hisp.dhis.tracker.imports.report.ValidationReport; import org.hisp.dhis.webapi.controller.CrudControllerAdvice; import org.hisp.dhis.webapi.controller.tracker.ControllerSupport; @@ -85,14 +86,14 @@ class TrackerImportControllerTest { @Mock private DefaultTrackerImportService trackerImportService; - @Mock private TrackerSyncImporter syncImporter; - - @Mock private TrackerAsyncImporter asyncImporter; - @Mock private CsvService csvEventService; @Mock private Notifier notifier; + @Mock private JobSchedulerService jobSchedulerService; + + @Mock private JobConfigurationService jobConfigurationService; + private RenderService renderService; @BeforeEach @@ -106,7 +107,11 @@ public void setUp() { // Controller under test final TrackerImportController controller = new TrackerImportController( - syncImporter, asyncImporter, trackerImportService, csvEventService, notifier); + trackerImportService, + csvEventService, + notifier, + jobSchedulerService, + jobConfigurationService); mockMvc = MockMvcBuilders.standaloneSetup(controller) @@ -140,19 +145,17 @@ void verifyAsyncForCsv() throws Exception { .andExpect(content().contentType("application/json")); verify(csvEventService).read(any(), eq(true)); - verify(asyncImporter).importTracker(any(), any(), any()); } @Test void verifySyncResponseShouldBeOkWhenImportReportStatusIsOk() throws Exception { // When - when(syncImporter.importTracker(any())) + when(trackerImportService.buildImportReport(any(), any())) .thenReturn( ImportReport.withImportCompleted( Status.OK, PersistenceReport.emptyReport(), ValidationReport.emptyReport(), - new TimingsStats(), new HashMap<>())); // Then @@ -170,7 +173,7 @@ void verifySyncResponseShouldBeOkWhenImportReportStatusIsOk() throws Exception { .getResponse() .getContentAsString(); - verify(syncImporter).importTracker(any()); + verify(trackerImportService).importTracker(any(), any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -182,13 +185,12 @@ void verifySyncResponseShouldBeOkWhenImportReportStatusIsOk() throws Exception { @Test void verifySyncResponseForCsvShouldBeOkWhenImportReportStatusIsOk() throws Exception { // When - when(syncImporter.importTracker(any())) + when(trackerImportService.buildImportReport(any(), any())) .thenReturn( ImportReport.withImportCompleted( Status.OK, PersistenceReport.emptyReport(), ValidationReport.emptyReport(), - new TimingsStats(), new HashMap<>())); // Then @@ -206,7 +208,7 @@ void verifySyncResponseForCsvShouldBeOkWhenImportReportStatusIsOk() throws Excep .getContentAsString(); verify(csvEventService).read(any(), eq(true)); - verify(syncImporter).importTracker(any()); + verify(trackerImportService).importTracker(any(), any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -219,10 +221,8 @@ void verifySyncResponseForCsvShouldBeOkWhenImportReportStatusIsOk() throws Excep void verifySyncResponseShouldBeConflictWhenImportReportStatusIsError() throws Exception { String errorMessage = "errorMessage"; // When - when(syncImporter.importTracker(any())) - .thenReturn( - ImportReport.withError( - "errorMessage", ValidationReport.emptyReport(), new TimingsStats())); + when(trackerImportService.buildImportReport(any(), any())) + .thenReturn(ImportReport.withError(errorMessage, ValidationReport.emptyReport())); // Then String contentAsString = @@ -239,7 +239,7 @@ void verifySyncResponseShouldBeConflictWhenImportReportStatusIsError() throws Ex .getResponse() .getContentAsString(); - verify(syncImporter).importTracker(any()); + verify(trackerImportService).importTracker(any(), any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -252,10 +252,8 @@ void verifySyncResponseShouldBeConflictWhenImportReportStatusIsError() throws Ex void verifySyncResponseForCsvShouldBeConflictWhenImportReportStatusIsError() throws Exception { String errorMessage = "errorMessage"; // When - when(syncImporter.importTracker(any())) - .thenReturn( - ImportReport.withError( - "errorMessage", ValidationReport.emptyReport(), new TimingsStats())); + when(trackerImportService.buildImportReport(any(), any())) + .thenReturn(ImportReport.withError(errorMessage, ValidationReport.emptyReport())); // Then String contentAsString = @@ -272,7 +270,7 @@ void verifySyncResponseForCsvShouldBeConflictWhenImportReportStatusIsError() thr .getContentAsString(); verify(csvEventService).read(any(), eq(true)); - verify(syncImporter).importTracker(any()); + verify(trackerImportService).importTracker(any(), any()); try { renderService.fromJson(contentAsString, ImportReport.class); @@ -285,7 +283,7 @@ void verifySyncResponseForCsvShouldBeConflictWhenImportReportStatusIsError() thr void verifyShouldFindJob() throws Exception { String uid = CodeGenerator.generateUid(); // When - when(notifier.getNotificationsByJobId(JobType.TRACKER_IMPORT_JOB, uid)) + when(notifier.getNotificationsByJobId(TRACKER_IMPORT_JOB, uid)) .thenReturn(new LinkedList<>(singletonList(new Notification()))); // Then @@ -305,7 +303,7 @@ void verifyShouldFindJob() throws Exception { .getResponse() .getContentAsString(); - verify(notifier).getNotificationsByJobId(JobType.TRACKER_IMPORT_JOB, uid); + verify(notifier).getNotificationsByJobId(TRACKER_IMPORT_JOB, uid); } @Test @@ -317,11 +315,10 @@ void verifyShouldFindJobReport() throws Exception { Status.OK, PersistenceReport.emptyReport(), ValidationReport.emptyReport(), - new TimingsStats(), new HashMap<>()); // When - when(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)).thenReturn(importReport); + when(notifier.getJobSummaryByJobId(TRACKER_IMPORT_JOB, uid)).thenReturn(importReport); when(trackerImportService.buildImportReport(any(), any())).thenReturn(importReport); @@ -340,7 +337,7 @@ void verifyShouldFindJobReport() throws Exception { .getResponse() .getContentAsString(); - verify(notifier).getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid); + verify(notifier).getJobSummaryByJobId(TRACKER_IMPORT_JOB, uid); verify(trackerImportService).buildImportReport(any(), any()); try { @@ -355,7 +352,7 @@ void verifyShouldThrowWhenJobReportNotFound() throws Exception { String uid = CodeGenerator.generateUid(); // When - when(notifier.getJobSummaryByJobId(JobType.TRACKER_IMPORT_JOB, uid)).thenReturn(null); + when(notifier.getJobSummaryByJobId(TRACKER_IMPORT_JOB, uid)).thenReturn(null); // Then mockMvc diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java index 63e8c827f19e..8cb802fe993d 100644 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java +++ b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImportParamsMapperTest.java @@ -63,8 +63,7 @@ void testValidationMode() { e -> { RequestParams requestParams = RequestParams.builder().validationMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getValidationMode(), is(e)); }); } @@ -76,8 +75,7 @@ void testImportMode() { e -> { RequestParams requestParams = RequestParams.builder().importMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getImportMode(), is(e)); }); } @@ -89,8 +87,7 @@ void testAtomicMode() { e -> { RequestParams requestParams = RequestParams.builder().atomicMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getAtomicMode(), is(e)); }); } @@ -102,8 +99,7 @@ void testFlushMode() { e -> { RequestParams requestParams = RequestParams.builder().flushMode(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getFlushMode(), is(e)); }); } @@ -115,8 +111,7 @@ void testImportStrategy() { e -> { RequestParams requestParams = RequestParams.builder().importStrategy(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat(params.getImportStrategy(), is(e)); }); } @@ -126,8 +121,7 @@ void testIdSchemeUsingIdSchemeName() { RequestParams requestParams = RequestParams.builder().idScheme(TrackerIdSchemeParam.NAME).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); TrackerIdSchemeParam expected = TrackerIdSchemeParam.NAME; assertEquals(expected, params.getIdSchemes().getIdScheme()); @@ -144,8 +138,7 @@ void testIdSchemeUsingIdSchemeAttribute() { RequestParams requestParams = RequestParams.builder().idScheme(TrackerIdSchemeParam.ofAttribute("WSiOAALYocA")).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); TrackerIdSchemeParam expected = TrackerIdSchemeParam.ofAttribute("WSiOAALYocA"); assertEquals(expected, params.getIdSchemes().getIdScheme()); @@ -164,8 +157,7 @@ void testOrgUnitIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().orgUnitIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getOrgUnitIdScheme().getIdScheme(), is(e.getIdScheme())); }); @@ -178,8 +170,7 @@ void testProgramIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().programIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getProgramIdScheme().getIdScheme(), is(e.getIdScheme())); }); @@ -192,8 +183,7 @@ void testProgramIdentifierUsingIdSchemeAttribute() { .programIdScheme(TrackerIdSchemeParam.ofAttribute("WSiOAALYocA")) .build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertEquals( TrackerIdSchemeParam.ofAttribute("WSiOAALYocA"), @@ -207,8 +197,7 @@ void testProgramStageIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().programStageIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getProgramStageIdScheme().getIdScheme(), is(e.getIdScheme())); @@ -222,8 +211,7 @@ void testDataElementIdentifier() { e -> { RequestParams requestParams = RequestParams.builder().dataElementIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getDataElementIdScheme().getIdScheme(), is(e.getIdScheme())); @@ -238,8 +226,7 @@ void testCategoryOptionComboIdentifier() { RequestParams requestParams = RequestParams.builder().categoryOptionComboIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getCategoryOptionComboIdScheme().getIdScheme(), is(e.getIdScheme())); @@ -254,8 +241,7 @@ void testCategoryOptionIdentifier() { RequestParams requestParams = RequestParams.builder().categoryOptionIdScheme(e).build(); TrackerImportParams params = - TrackerImportParamsMapper.trackerImportParams( - true, JOB_ID, "userId", requestParams, Body.builder().build()); + TrackerImportParamsMapper.trackerImportParams("userId", requestParams); assertThat( params.getIdSchemes().getCategoryOptionIdScheme().getIdScheme(), is(e.getIdScheme())); diff --git a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java b/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java deleted file mode 100644 index 0d1fd39f68b8..000000000000 --- a/dhis-2/dhis-web-api/src/test/java/org/hisp/dhis/webapi/controller/tracker/imports/TrackerImporterImplTest.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2004-2022, University of Oslo - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * Neither the name of the HISP project nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.hisp.dhis.webapi.controller.tracker.imports; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import org.hisp.dhis.artemis.MessageManager; -import org.hisp.dhis.artemis.Topics; -import org.hisp.dhis.scheduling.JobConfiguration; -import org.hisp.dhis.scheduling.JobType; -import org.hisp.dhis.tracker.imports.TrackerBundleReportMode; -import org.hisp.dhis.tracker.imports.TrackerImportParams; -import org.hisp.dhis.tracker.imports.TrackerImportService; -import org.hisp.dhis.tracker.imports.job.TrackerMessage; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -@ExtendWith(MockitoExtension.class) -class TrackerImporterImplTest { - @InjectMocks TrackerAsyncImporter asyncImporter; - - @InjectMocks TrackerSyncImporter syncImporter; - - @Mock TrackerImportService trackerImportService; - - @Mock MessageManager messageManager; - - @Test - void shouldCreateReportSync() { - TrackerImportParams params = - TrackerImportParams.builder() - .jobConfiguration(new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, "userId")) - .reportMode(TrackerBundleReportMode.FULL) - .build(); - - syncImporter.importTracker(params); - - verify(trackerImportService).importTracker(params); - verify(trackerImportService).buildImportReport(any(), eq(TrackerBundleReportMode.FULL)); - } - - @Test - void shouldSendMessageToQueueAsync() { - ArgumentCaptor queueNameCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor trackerMessageCaptor = - ArgumentCaptor.forClass(TrackerMessage.class); - - doNothing() - .when(messageManager) - .sendQueue(queueNameCaptor.capture(), trackerMessageCaptor.capture()); - - TrackerImportParams params = - TrackerImportParams.builder() - .jobConfiguration(new JobConfiguration("", JobType.TRACKER_IMPORT_JOB, "userId")) - .build(); - - asyncImporter.importTracker(params, null, ""); - - verify(trackerImportService, times(0)).importTracker(any()); - verify(messageManager).sendQueue(any(), any()); - assertEquals(Topics.TRACKER_IMPORT_JOB_TOPIC_NAME, queueNameCaptor.getValue()); - assertEquals(params, trackerMessageCaptor.getValue().getTrackerImportParams()); - } -} From ebae39faffdbeebe16c2b302bd9432bd0de50c79 Mon Sep 17 00:00:00 2001 From: David Mackessy <131455290+david-mackessy@users.noreply.github.com> Date: Tue, 14 Nov 2023 16:51:29 +0000 Subject: [PATCH 63/63] =?UTF-8?q?fix:=20Remove=20unnecessary=20calls=20to?= =?UTF-8?q?=20the=20DB=20during=20DataValueSet=20import=20[D=E2=80=A6=20(#?= =?UTF-8?q?15688)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: Remove unnecessary calls to the DB during DataValueSet import [DHIS2-16159] * fix: Remove unused dep and clean up test [DHIS2-16159] * fix format --- .../DataValueSetImportValidator.java | 6 +----- .../DataValueSetImportValidatorTest.java | 16 +--------------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidator.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidator.java index cccdc7053c59..d2c9ec0c6cc7 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidator.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidator.java @@ -54,7 +54,6 @@ import org.hisp.dhis.dxf2.importsummary.ImportStatus; import org.hisp.dhis.dxf2.importsummary.ImportSummary; import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodType; import org.hisp.dhis.security.acl.AclService; @@ -78,8 +77,6 @@ public class DataValueSetImportValidator { private final DataValueService dataValueService; - private final OrganisationUnitService organisationUnitService; - /** Validation on the {@link DataSet} level */ interface DataSetValidation { void validate(DataValueSet dataValueSet, ImportContext context, DataSetContext dataSetContext); @@ -645,8 +642,7 @@ private void checkDataValueOrgUnitValidForAttrOptionCombo( private boolean isOrgUnitValidForAttrOptionCombo(DataValueContext valueContext) { Set aocOrgUnits = valueContext.getAttrOptionCombo().getOrganisationUnits(); - return aocOrgUnits == null - || organisationUnitService.isDescendant(valueContext.getOrgUnit(), aocOrgUnits); + return aocOrgUnits == null || valueContext.getOrgUnit().isDescendant(aocOrgUnits); } private static void checkDataValueTargetDataSets( diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidatorTest.java b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidatorTest.java index a4c87d0ef9ad..da4b9bdfbceb 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidatorTest.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/datavalueset/DataValueSetImportValidatorTest.java @@ -72,7 +72,6 @@ import org.hisp.dhis.importexport.ImportStrategy; import org.hisp.dhis.option.OptionSet; import org.hisp.dhis.organisationunit.OrganisationUnit; -import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodType; import org.hisp.dhis.period.PeriodTypeEnum; @@ -99,8 +98,6 @@ class DataValueSetImportValidatorTest { private DataValueSetImportValidator validator; - private OrganisationUnitService organisationUnitService; - private final CategoryCombo defaultCombo = new CategoryCombo(); @BeforeEach @@ -109,16 +106,11 @@ void setUp() { lockExceptionStore = mock(LockExceptionStore.class); approvalService = mock(DataApprovalService.class); dataValueService = mock(DataValueService.class); - organisationUnitService = mock(OrganisationUnitService.class); i18n = mock(I18n.class); validator = new DataValueSetImportValidator( - aclService, - lockExceptionStore, - approvalService, - dataValueService, - organisationUnitService); + aclService, lockExceptionStore, approvalService, dataValueService); validator.init(); setupUserCanWriteCategoryOptions(true); when(i18n.getString(anyString())) @@ -298,12 +290,6 @@ void testValidateDataValueAttrOptionComboAccess() { @Test void testValidateDataValueOrgUnitInUserHierarchy() { - when(organisationUnitService.isDescendant(any(OrganisationUnit.class), any(Set.class))) - .thenReturn(false); - when(organisationUnitService.isDescendant( - any(OrganisationUnit.class), any(OrganisationUnit.class))) - .thenReturn(false); - DataValue dataValue = createRandomDataValue(); DataValueContext valueContext = createDataValueContext(dataValue).build(); DataSetContext dataSetContext = createMinimalDataSetContext().build();