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;
}
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;
}
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()));
}
}
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);
}
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()));
}
}
Aggregations