Search in sources :

Example 36 with ERROR

use of org.hisp.dhis.dxf2.importsummary.ImportStatus.ERROR in project dhis2-core by dhis2.

the class EventManager method deleteEvents.

public ImportSummaries deleteEvents(final List<Event> events, final WorkContext workContext) {
    final ImportSummaries importSummaries = new ImportSummaries();
    // pre-process events
    executorsByPhase.get(EventProcessorPhase.DELETE_PRE).execute(workContext, events);
    if (ImportStrategyUtils.isDelete(workContext.getImportOptions().getImportStrategy())) {
        importSummaries.addImportSummaries(run(workContext, events, checkersRunOnDelete));
    }
    // collect the UIDs of events that did not pass validation
    final List<String> eventValidationFailedUids = importSummaries.getImportSummaries().stream().filter(i -> i.isStatus(ERROR)).map(ImportSummary::getReference).collect(toList());
    if (eventValidationFailedUids.size() == events.size()) {
        return importSummaries;
    }
    if (!workContext.getImportOptions().isDryRun()) {
        try {
            eventPersistenceService.delete(workContext, eventValidationFailedUids.isEmpty() ? events : events.stream().filter(e -> !eventValidationFailedUids.contains(e.getEvent())).collect(toList()));
        } catch (Exception e) {
            handleFailure(workContext, importSummaries, events, IMPORT_ERROR_STRING, DELETE);
        }
        final List<String> eventPersistenceFailedUids = importSummaries.getImportSummaries().stream().filter(i -> i.isStatus(ERROR)).map(ImportSummary::getReference).collect(toList());
        // Post processing only the events that passed validation and were
        // persisted
        // correctly.
        executorsByPhase.get(EventProcessorPhase.DELETE_POST).execute(workContext, events.stream().filter(e -> !eventPersistenceFailedUids.contains(e.getEvent())).collect(toList()));
        incrementSummaryTotals(events, importSummaries, DELETE);
    }
    return importSummaries;
}
Also used : ImportStrategy(org.hisp.dhis.importexport.ImportStrategy) DELETE(org.hisp.dhis.importexport.ImportStrategy.DELETE) RequiredArgsConstructor(lombok.RequiredArgsConstructor) Program(org.hisp.dhis.program.Program) Collections.singletonList(java.util.Collections.singletonList) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) WorkContext(org.hisp.dhis.dxf2.events.importer.context.WorkContext) ImportSummary(org.hisp.dhis.dxf2.importsummary.ImportSummary) ERROR(org.hisp.dhis.dxf2.importsummary.ImportStatus.ERROR) ImmutableList(com.google.common.collect.ImmutableList) CREATE(org.hisp.dhis.importexport.ImportStrategy.CREATE) CollectionUtils(org.apache.commons.collections.CollectionUtils) Map(java.util.Map) Qualifier(org.springframework.beans.factory.annotation.Qualifier) EventPersistenceService(org.hisp.dhis.dxf2.events.event.persistence.EventPersistenceService) WARNING(org.hisp.dhis.dxf2.importsummary.ImportStatus.WARNING) ImportSummary.error(org.hisp.dhis.dxf2.importsummary.ImportSummary.error) NonNull(lombok.NonNull) Set(java.util.Set) Event(org.hisp.dhis.dxf2.events.event.Event) ProgramStage(org.hisp.dhis.program.ProgramStage) ImportSummaries(org.hisp.dhis.dxf2.importsummary.ImportSummaries) Collectors.toList(java.util.stream.Collectors.toList) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) Component(org.springframework.stereotype.Component) CollectionUtils.isNotEmpty(org.apache.commons.collections4.CollectionUtils.isNotEmpty) ImmutableEvent(org.hisp.dhis.dxf2.events.importer.shared.ImmutableEvent) UPDATE(org.hisp.dhis.importexport.ImportStrategy.UPDATE) SUCCESS(org.hisp.dhis.dxf2.importsummary.ImportStatus.SUCCESS) IdScheme(org.hisp.dhis.common.IdScheme) ImportSummaries(org.hisp.dhis.dxf2.importsummary.ImportSummaries)

Example 37 with ERROR

use of org.hisp.dhis.dxf2.importsummary.ImportStatus.ERROR in project dhis2-core by dhis2.

the class EventBaseCheck method check.

@Override
public ImportSummary check(ImmutableEvent event, WorkContext ctx) {
    ImportSummary importSummary = new ImportSummary();
    List<String> errors = validate(event, ctx);
    if (!errors.isEmpty()) {
        importSummary.setStatus(ERROR);
        importSummary.setReference(event.getEvent());
        errors.forEach(error -> importSummary.addConflict("Event", error));
        importSummary.incrementIgnored();
    }
    return importSummary;
}
Also used : ImportSummary(org.hisp.dhis.dxf2.importsummary.ImportSummary)

Example 38 with ERROR

use of org.hisp.dhis.dxf2.importsummary.ImportStatus.ERROR in project dhis2-core by dhis2.

the class AbstractTrackedEntityInstanceService method mergeOrDeleteTrackedEntityInstances.

// -------------------------------------------------------------------------
// CREATE, UPDATE or DELETE
// -------------------------------------------------------------------------
@Override
@Transactional
public ImportSummaries mergeOrDeleteTrackedEntityInstances(List<TrackedEntityInstance> trackedEntityInstances, ImportOptions importOptions, JobConfiguration jobId) {
    notifier.clear(jobId).notify(jobId, "Importing tracked entities");
    try {
        ImportSummaries importSummaries = new ImportSummaries();
        importOptions = updateImportOptions(importOptions);
        List<TrackedEntityInstance> create = new ArrayList<>();
        List<TrackedEntityInstance> update = new ArrayList<>();
        List<TrackedEntityInstance> delete = new ArrayList<>();
        // TODO: Check whether relationships are modified during
        // create/update/delete TEI logic. Decide whether logic below can be
        // removed
        List<Relationship> relationships = getRelationships(trackedEntityInstances);
        setTrackedEntityListByStrategy(trackedEntityInstances, importOptions, create, update, delete);
        importSummaries.addImportSummaries(addTrackedEntityInstances(create, importOptions));
        importSummaries.addImportSummaries(updateTrackedEntityInstances(update, importOptions));
        importSummaries.addImportSummaries(deleteTrackedEntityInstances(delete, importOptions));
        // TODO: Created importSummaries don't contain correct href (TEI
        // endpoint instead of relationships is used)
        importSummaries.addImportSummaries(relationshipService.processRelationshipList(relationships, importOptions));
        if (ImportReportMode.ERRORS == importOptions.getReportMode()) {
            importSummaries.getImportSummaries().removeIf(is -> !is.hasConflicts());
        }
        notifier.notify(jobId, NotificationLevel.INFO, "Import done", true).addJobSummary(jobId, importSummaries, ImportSummaries.class);
        return importSummaries;
    } catch (RuntimeException ex) {
        log.error(DebugUtils.getStackTrace(ex));
        notifier.notify(jobId, ERROR, "Process failed: " + ex.getMessage(), true);
        return new ImportSummaries().addImportSummary(new ImportSummary(ImportStatus.ERROR, "The import process failed: " + ex.getMessage()));
    }
}
Also used : ImportSummary(org.hisp.dhis.dxf2.importsummary.ImportSummary) ArrayList(java.util.ArrayList) ImportSummaries(org.hisp.dhis.dxf2.importsummary.ImportSummaries) Transactional(org.springframework.transaction.annotation.Transactional)

Example 39 with ERROR

use of org.hisp.dhis.dxf2.importsummary.ImportStatus.ERROR in project dhis2-core by dhis2.

the class SyncUtils method runSyncRequest.

public static Optional<AbstractWebMessageResponse> runSyncRequest(RestTemplate restTemplate, RequestCallback requestCallback, Class<? extends AbstractWebMessageResponse> klass, String syncUrl, int maxSyncAttempts) {
    boolean networkErrorOccurred = true;
    int syncAttemptsDone = 0;
    ResponseExtractor<? extends AbstractWebMessageResponse> responseExtractor = getResponseExtractor(klass);
    AbstractWebMessageResponse responseSummary = null;
    while (networkErrorOccurred) {
        networkErrorOccurred = false;
        syncAttemptsDone++;
        try {
            responseSummary = restTemplate.execute(syncUrl, HttpMethod.POST, requestCallback, responseExtractor);
        } catch (HttpClientErrorException ex) {
            String responseBody = ex.getResponseBodyAsString();
            try {
                responseSummary = WebMessageParseUtils.fromWebMessageResponse(responseBody, klass);
            } catch (WebMessageParseException e) {
                log.error("Parsing WebMessageResponse failed.", e);
                return Optional.empty();
            }
        } catch (HttpServerErrorException ex) {
            String responseBody = ex.getResponseBodyAsString();
            log.error("Internal error happened during event data push: " + responseBody, ex);
            if (syncAttemptsDone <= maxSyncAttempts) {
                networkErrorOccurred = true;
            } else {
                throw ex;
            }
        } catch (ResourceAccessException ex) {
            log.error("Exception during event data push: " + ex.getMessage(), ex);
            throw ex;
        }
    }
    log.info("Sync summary: " + responseSummary);
    return Optional.ofNullable(responseSummary);
}
Also used : WebMessageParseException(org.hisp.dhis.dxf2.webmessage.WebMessageParseException) HttpClientErrorException(org.springframework.web.client.HttpClientErrorException) AbstractWebMessageResponse(org.hisp.dhis.dxf2.webmessage.AbstractWebMessageResponse) HttpServerErrorException(org.springframework.web.client.HttpServerErrorException) ResourceAccessException(org.springframework.web.client.ResourceAccessException)

Example 40 with ERROR

use of org.hisp.dhis.dxf2.importsummary.ImportStatus.ERROR in project dhis2-core by dhis2.

the class DefaultCompleteDataSetRegistrationExchangeServiceTest method verifyUserHasNoWritePermissionOnCategoryOption.

@Test
void verifyUserHasNoWritePermissionOnCategoryOption() {
    OrganisationUnit organisationUnit = createOrganisationUnit('A');
    DataSet dataSetA = createDataSet('A', new MonthlyPeriodType());
    CategoryCombo categoryCombo = createCategoryCombo('A');
    CategoryOption categoryOptionA = createCategoryOption('A');
    CategoryOption categoryOptionB = createCategoryOption('B');
    CategoryOptionCombo categoryOptionCombo = createCategoryOptionCombo(categoryCombo, categoryOptionA, categoryOptionB);
    Period period = createPeriod("201907");
    String payload = createPayload(period, organisationUnit, dataSetA, categoryCombo, categoryOptionA, categoryOptionB);
    try (MockedConstruction<MetadataCaches> mocked = mockConstruction(MetadataCaches.class, (mock, context) -> {
        when(mock.getDataSets()).thenReturn(datasetCache);
        when(mock.getPeriods()).thenReturn(periodCache);
        when(mock.getOrgUnits()).thenReturn(orgUnitCache);
        aocCache = new CachingMap<>();
        when(mock.getAttrOptionCombos()).thenReturn(aocCache);
        when(mock.getOrgUnitInHierarchyMap()).thenReturn(orgUnitInHierarchyCache);
        when(mock.getAttrOptComboOrgUnitMap()).thenReturn(attrOptComboOrgUnitCache);
    })) {
        when(currentUserService.getCurrentUser()).thenReturn(user);
        when(batchHandler.init()).thenReturn(batchHandler);
        when(idObjManager.get(CategoryCombo.class, categoryCombo.getUid())).thenReturn(categoryCombo);
        when(idObjManager.getObject(CategoryOption.class, IdScheme.UID, categoryOptionA.getUid())).thenReturn(categoryOptionA);
        when(idObjManager.getObject(CategoryOption.class, IdScheme.UID, categoryOptionB.getUid())).thenReturn(categoryOptionB);
        when(categoryService.getCategoryOptionCombo(categoryCombo, Sets.newHashSet(categoryOptionA, categoryOptionB))).thenReturn(categoryOptionCombo);
        when(datasetCache.get(eq(dataSetA.getUid()), any())).thenReturn(dataSetA);
        when(periodCache.get(eq(period.getIsoDate()), any())).thenReturn(period);
        when(orgUnitCache.get(eq(organisationUnit.getUid()), any())).thenReturn(createOrganisationUnit('A'));
        when(orgUnitInHierarchyCache.get(eq(organisationUnit.getUid()), any())).thenReturn(Boolean.TRUE);
        when(attrOptComboOrgUnitCache.get(eq(categoryOptionCombo.getUid() + organisationUnit.getUid()), any())).thenReturn(Boolean.TRUE);
        when(categoryService.getCategoryOptionCombo(categoryOptionCombo.getUid())).thenReturn(categoryOptionCombo);
        // force error on access check for Category Option Combo
        when(aclService.canDataWrite(user, dataSetA)).thenReturn(true);
        when(aclService.canDataWrite(user, categoryOptionA)).thenReturn(false);
        when(aclService.canDataWrite(user, categoryOptionB)).thenReturn(true);
        when(notifier.clear(null)).thenReturn(notifier);
        when(systemSettingManager.getBoolSetting(SettingKey.DATA_IMPORT_STRICT_PERIODS)).thenReturn(false);
        when(systemSettingManager.getBoolSetting(SettingKey.DATA_IMPORT_STRICT_ATTRIBUTE_OPTION_COMBOS)).thenReturn(false);
        when(systemSettingManager.getBoolSetting(SettingKey.DATA_IMPORT_STRICT_ORGANISATION_UNITS)).thenReturn(false);
        when(systemSettingManager.getBoolSetting(SettingKey.DATA_IMPORT_REQUIRE_ATTRIBUTE_OPTION_COMBO)).thenReturn(false);
        when(currentUserService.getCurrentUserOrganisationUnits()).thenReturn(Collections.singleton(createOrganisationUnit('A')));
        when(i18nManager.getI18n()).thenReturn(i18n);
        when(categoryService.getDefaultCategoryOptionCombo()).thenReturn(DEFAULT_COC);
        when(batchHandlerFactory.createBatchHandler(CompleteDataSetRegistrationBatchHandler.class)).thenReturn(batchHandler);
        when(notifier.notify(any(), anyString())).thenReturn(notifier);
        when(notifier.notify(null, NotificationLevel.INFO, "Import done", true)).thenReturn(notifier);
        // call method under test
        ImportSummary summary = subject.saveCompleteDataSetRegistrationsJson(new ByteArrayInputStream(payload.getBytes()), new ImportOptions());
        assertThat(summary.getStatus(), is(ImportStatus.ERROR));
        assertThat(summary.getImportCount().getIgnored(), is(1));
        assertEquals(1, summary.getConflictCount());
        assertThat(summary.getConflicts().iterator().next().getValue(), is("User has no data write access for CategoryOption: " + categoryOptionA.getUid()));
    }
}
Also used : DhisConvenienceTest.createOrganisationUnit(org.hisp.dhis.DhisConvenienceTest.createOrganisationUnit) OrganisationUnit(org.hisp.dhis.organisationunit.OrganisationUnit) DhisConvenienceTest.createDataSet(org.hisp.dhis.DhisConvenienceTest.createDataSet) DataSet(org.hisp.dhis.dataset.DataSet) ImportSummary(org.hisp.dhis.dxf2.importsummary.ImportSummary) DhisConvenienceTest.createPeriod(org.hisp.dhis.DhisConvenienceTest.createPeriod) Period(org.hisp.dhis.period.Period) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) MonthlyPeriodType(org.hisp.dhis.period.MonthlyPeriodType) CategoryCombo(org.hisp.dhis.category.CategoryCombo) DhisConvenienceTest.createCategoryCombo(org.hisp.dhis.DhisConvenienceTest.createCategoryCombo) ByteArrayInputStream(java.io.ByteArrayInputStream) CategoryOption(org.hisp.dhis.category.CategoryOption) DhisConvenienceTest.createCategoryOption(org.hisp.dhis.DhisConvenienceTest.createCategoryOption) DhisConvenienceTest.createCategoryOptionCombo(org.hisp.dhis.DhisConvenienceTest.createCategoryOptionCombo) CategoryOptionCombo(org.hisp.dhis.category.CategoryOptionCombo) ImportOptions(org.hisp.dhis.dxf2.common.ImportOptions) Test(org.junit.jupiter.api.Test)

Aggregations

ImportSummary (org.hisp.dhis.dxf2.importsummary.ImportSummary)33 Test (org.junit.jupiter.api.Test)25 User (org.hisp.dhis.user.User)21 TransactionalIntegrationTest (org.hisp.dhis.TransactionalIntegrationTest)20 IOException (java.io.IOException)15 Event (org.hisp.dhis.dxf2.events.event.Event)14 List (java.util.List)12 ImportSummaries (org.hisp.dhis.dxf2.importsummary.ImportSummaries)11 WebMessageException (org.hisp.dhis.dxf2.webmessage.WebMessageException)9 ImportStrategy (org.hisp.dhis.importexport.ImportStrategy)9 ClassPathResource (org.springframework.core.io.ClassPathResource)9 ImportReport (org.hisp.dhis.dxf2.metadata.feedback.ImportReport)8 ProgramStageInstance (org.hisp.dhis.program.ProgramStageInstance)7 GetMapping (org.springframework.web.bind.annotation.GetMapping)7 ArrayList (java.util.ArrayList)6 FileResource (org.hisp.dhis.fileresource.FileResource)6 SchemaService (org.hisp.dhis.schema.SchemaService)6 UserService (org.hisp.dhis.user.UserService)6 Autowired (org.springframework.beans.factory.annotation.Autowired)6 InputStream (java.io.InputStream)4